

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Neptune における openCypher の仕様準拠
<a name="feature-opencypher-compliance"></a>

openCypher の Amazon Neptune リリースは、一般に、現在の openCypher 仕様 (「[Cypher Query Language Reference Version 9](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)」) で定義されている句、演算子、式、関数、および構文をサポートしています。openCypher の Neptune サポートの制限と相違点を以下に説明します。

 Amazon Neptune は、openCypher 仕様の範囲を超えるいくつかの機能もサポートしています。詳細については、[Amazon Neptune の openCypher 拡張機能](access-graph-opencypher-extensions.md) を参照してください。

**注記**  
現在の Neo4j の Cypher 実装には、上記の openCypher 仕様には含まれていない機能が含まれています。現在の Cypher コードを Neptune に移行する場合、詳細については, 「[Neptune の Neo4j との互換性](migration-compatibility.md)」と「[Neptune 上の openCypherで実行するように Cypher クエリを書き直す](migration-opencypher-rewrites.md)」を参照してください。

## Neptune における openCypher 句のサポート
<a name="opencypher-compliance-clauses"></a>

Neptune は、特に注記がなければ、以下の句をサポートしています。
+ `MATCH` — サポートされています。ただし、*`shortestPath()`* と *`allShortestPaths()`* は、現在はサポートされていません。
+ `OPTIONAL MATCH`
+ *`MANDATORY MATCH`* — Neptune では現在サポートされて**いません**。ただし、Neptune は `MATCH` クエリでの[カスタム ID](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids) 値をサポートしています。
+ `RETURN` — サポートされています。ただし、`SKIP` または `LIMIT` として非静的な値が使用される場合を除きます。例えば、以下は現時点では機能しません。

  ```
  MATCH (n)
  RETURN n LIMIT toInteger(rand())    // Does NOT work!
  ```
+ `WITH` — サポートされています。ただし、`SKIP` または `LIMIT` として非静的な値が使用される場合を除きます。例えば、以下は現時点では機能しません。

  ```
  MATCH (n)
  WITH n SKIP toInteger(rand())
  WITH count() AS count
  RETURN count > 0 AS nonEmpty    // Does NOT work!
  ```
+ `UNWIND`
+ `WHERE`
+ `ORDER BY`
+ `SKIP`
+ `LIMIT`
+ `CREATE` — Neptune では、`CREATE` クエリで[カスタム ID 値](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids)を作成できます。
+ `DELETE`
+ `SET`
+ `REMOVE`
+ `MERGE` - Neptune は `MERGE` クエリでの[カスタム ID 値](access-graph-opencypher-extensions.md#opencypher-compliance-custom-ids)をサポートしています。
+ *`CALL[YIELD...]`* — Neptune では現在**サポートされていません**。
+ `UNION, UNION ALL` — 読み取り専用クエリはサポートされていますが、ミューテーションクエリは現在サポートされて**いません**。
+  `USING` – `USING` はエンジンバージョン [1.3.2.0](https://docs.aws.amazon.com//neptune/latest/userguide/engine-releases-1.3.2.0.html) でサポートされています。詳細については、「[クエリヒント](https://docs.aws.amazon.com//neptune/latest/userguide/opencypher-query-hints.html)」を参照してください。

## Neptune における openCypher 演算子のサポート
<a name="opencypher-compliance-operators"></a>

Neptune は、特に注記がなければ、以下の演算子をサポートしています。

**一般的な演算子**
+ `DISTINCT`
+ ネストされたリテラルマップのプロパティにアクセスするための `.` 演算子。

**算術演算子**
+ `+` 加算演算子。
+ `-` 減算演算子。
+ `*` 乗算演算子。
+ `/` 除算演算子。
+ `%` 剰余除算演算子。
+ `^` 指数演算子は*サポート対象外*です。

**比較演算子**
+ `=` 加算演算子。
+ `<>` 不等式演算子。
+ `<` 小なり演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。
+ `>` 大なり演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。
+ `<=` 小なりイコール演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。
+ `>=` 大なりイコール演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。
+ `IS NULL`
+ `IS NOT NULL`
+ `STARTS WITH` は、検索するデータが文字列の場合にサポートされます。
+ `ENDS WITH` は、検索するデータが文字列の場合にサポートされます。
+ `CONTAINS` は、検索するデータが文字列の場合にサポートされます。

**ブール演算子**
+ `AND`
+ `OR`
+ `XOR`
+ `NOT`

**文字列演算子**
+ `+` 連結演算子。

**演算子一覧**
+ `+` 連結演算子。
+ `IN` (リスト内の項目の存在を確認します)

## Neptune での openCypher 式のサポート
<a name="opencypher-compliance-expressions"></a>

Neptune は、特に注記がなければ、以下の式をサポートしています。
+ `CASE`
+ ノード、リレーションシップ、またはマップ内で動的に計算されたプロパティキーにアクセスするための `[]` 式は、現在、Neptune ではサポートされて**いません**。例えば、以下は機能しません。

  ```
  MATCH (n)
  WITH [5, n, {key: 'value'}] AS list
  RETURN list[1].name
  ```

## Neptune における openCypher 関数のサポート
<a name="opencypher-compliance-functions"></a>

Neptune は、特に注記がなければ、以下の関数をサポートしています。

**述語関数**
+ `exists()`

**スカラー関数**
+ `coalesce()`
+ `endNode()`
+ `epochmillis()`
+ `head()`
+ `id()`
+ `last()`
+ `length()`
+ `randomUUID()`
+ `properties()`
+ `removeKeyFromMap`
+ `size()` — このオーバーロードされたメソッドは、現在のところ、パターン表現、リスト、文字列に対してのみ機能します。
+ `startNode()`
+ `timestamp()`
+ `toBoolean()`
+ `toFloat()`
+ `toInteger()`
+ `type()`

**集計関数**
+ `avg()`
+ `collect()`
+ `count()`
+ `max()`
+ `min()`
+ `percentileDisc()`
+ `stDev()`
+ `percentileCont()`
+ `stDevP()`
+ `sum()`

**関数の一覧表示**
+ [`join()`](access-graph-opencypher-extensions.md#opencypher-compliance-join-function) (リスト内の文字列を 1 つの文字列に連結する)
+ `keys()`
+ `labels()`
+ `nodes()`
+ `range()`
+ `relationships()`
+ `reverse()`
+ `tail()`

**数学関数 — 数値**
+ `abs()`
+ `ceil()`
+ `floor()`
+ `rand()`
+ `round()`
+ `sign()`

**数学関数 — 対数**
+ `e()`
+ `exp()`
+ `log()`
+ `log10()`
+ `sqrt()`

**数学関数 — 三角関数**
+ `acos()`
+ `asin()`
+ `atan()`
+ `atan2()`
+ `cos()`
+ `cot()`
+ `degrees()`
+ `pi()`
+ `radians()`
+ `sin()`
+ `tan()`

**文字列関数**
+ [`join()`](access-graph-opencypher-extensions.md#opencypher-compliance-join-function) (リスト内の文字列を 1 つの文字列に連結する)
+ `left()`
+ `lTrim()`
+ `replace()`
+ `reverse()`
+ `right()`
+ `rTrim()`
+ `split()`
+ `substring()`
+ `toLower()`
+ `toString()`
+ `toUpper()`
+ `trim()`

**ユーザー定義関数**

*ユーザー定義関数*は、Neptune では現在サポートされて**いません**。

## Neptune 固有の openCypher 実装の詳細
<a name="opencypher-compliance-differences"></a>

以下のセクションでは、openCypher の Neptune 実装が [openCypher 仕様](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)と異なる場合や、それを超える場合があることについて説明します。

### Neptune における可変長パス (VLP) 評価
<a name="opencypher-compliance-differences-vlp"></a>

可変長パス (`VLP`) 評価は、グラフ内のノード間のパスを検出します。クエリではパスの長さに制限はありません。サイクルを防ぐため、[openCypher 仕様](https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf)は、各エッジはソリューションごとに最大 1 回トラバースする必要があると規定しています。

VLP の場合、Neptune 実装は、プロパティ等価フィルターの定数値のみをサポートするという点で openCypher 仕様とは異なります。次のようなクエリがあるとします。

```
MATCH (x)-[:route*1..2 {dist:33, code:x.name}]->(y) return x,y
```

`x.name` プロパティ等価フィルターの値は定数ではないため、このクエリの結果は `UnsupportedOperationException` になり、`Property predicate over variable-length relationships with non-constant expression is not supported in this release.` というメッセージが表示されます。

### Neptune openCypher 実装での一時的なサポート (Neptune データベース 1.3.1.0 以前)
<a name="opencypher-compliance-time"></a>

Neptune は現在、openCypher の時間関数を限定的にサポートしています。時間型の `DateTime` データ型をサポートしています。

`datetime()` 関数を使用して、以下のように現在の UTC の日付と時刻を取得できます。

```
RETURN  datetime() as res
```

日付と時刻の値は、`"`*date*`T`*time*`"` 形式で文字列から解析できます。ここで、*date* と *time* は、どちらも以下のサポートされている形式のいずれかで表されます。

**サポートされている日付形式**
+ `yyyy-MM-dd`
+ `yyyyMMdd`
+ `yyyy-MM`
+ `yyyy-DDD`
+ `yyyyDDD`
+ `yyyy`

**サポートされている時刻形式**
+ `HH:mm:ssZ`
+ `HHmmssZ`
+ `HH:mm:ssZ`
+ `HH:mmZ`
+ `HHmmZ`
+ `HHZ`
+ `HHmmss`
+ `HH:mm:ss`
+ `HH:mm`
+ `HHmm`
+ `HH`

例えば、次のようになります。

```
RETURN datetime('2022-01-01T00:01')      // or another example:
RETURN datetime('2022T0001')
```

Neptune openCypher のすべての日付/時刻値は UTC 値として保存および取得されることに注意してください。

Neptune openCypher は `statement` クロックを使用します。つまり、クエリの実行中、時間的に同じインスタントが使用されます。同じトランザクション内の別のクエリでは、時間的に異なるインスタントが使用される場合があります。

Neptune は `datetime()` の呼び出し内での関数の使用をサポートしていません。例えば、以下は機能しません。

```
CREATE (:n {date:datetime(tostring(2021))})  // ---> NOT ALLOWED!
```

Neptune は `datetime` を `epochmillis` に変換する `epochmillis()` 関数をサポートしています。例えば、次のようになります。

```
MATCH (n) RETURN epochMillis(n.someDateTime)
1698972364782
```

Neptune は現在、`DateTime` オブジェクトに対する他の関数や演算 (加算や減算など) をサポートしていません。

### Neptune openCypher 実装 (Neptune Analytics および Neptune データベース 1.3.2.0 以降) での一時的なサポート
<a name="opencypher-compliance-time-na"></a>

OpenCypher の次の日時機能は、Neptune Analytics に適用されます。または、Labmode パラメータ `DatetimeMillisecond=enabled` を使用して、Neptune エンジンリリースバージョン 1.3.2.0 以降で次の日時機能を有効にすることもできます。ラボモードでこの機能を使用する方法の詳細については、「[拡張日時サポート](features-lab-mode.md#labmode-extended-datetime-support)」を参照してください。
+ ミリ秒のサポート。日時リテラルは、ミリ秒が 0 であっても、常にミリ秒単位で返されます。(以前の動作では、ミリ秒を切り捨てていました。)

  ```
  CREATE (:event {time: datetime('2024-04-01T23:59:59Z')})
  
  # Returning the date returns with 000 suffixed representing milliseconds
  MATCH(n:event)
  RETURN n.time as datetime
  
  {
    "results" : [ {
      "n" : {
        "~id" : "0fe88f7f-a9d9-470a-bbf2-fd6dd5bf1a7d",
        "~entityType" : "node",
        "~labels" : [ "event" ],
        "~properties" : {
          "time" : "2024-04-01T23:59:59.000Z"
        }
      }
    } ]
  }
  ```
+ 保存されたプロパティまたは中間結果に対して datetime() 関数を呼び出すためのサポート。例えば、この機能よりも前の機能では、次のクエリを実行できませんでした。

  プロパティに対する Datetime():

  ```
  // Create node with property 'time' stored as string
  CREATE (:event {time: '2024-04-01T23:59:59Z'})
  
  // Match and return this property as datetime
  MATCH(n:event)
  RETURN datetime(n.time) as datetime
  ```

  中間結果に対する Datetime():

  ```
  // Parse datetime from parameter
  UNWIND $list as myDate
  RETURN datetime(myDate) as d
  ```
+ 上記の場合に作成された datetime プロパティを保存することも可能になりました。

  あるプロパティの文字列プロパティから別のプロパティに日時を保存する:

  ```
  // Create node with property 'time' stored as string
  CREATE (:event {time: '2024-04-01T23:59:59Z', name: 'crash'})
  
  // Match and update the same property to datetime type
  MATCH(n:event {name: 'crash'})
  SET n.time = datetime(n.time)
  
  // Match and update another node's property
  MATCH(e:event {name: 'crash'})
  MATCH(n:server {name: e.servername})
  SET n.time = datetime(e.time)
  ```

  日時プロパティを使用してパラメータからノードをバッチ作成する:

  ```
  // Batch create from parameter
  UNWIND $list as events
  CREATE (n:crash) {time: datetime(events.time)}
  // Parameter value
  {
    "x":[
      {"time":"2024-01-01T23:59:29", "name":"crash1"},
      {"time":"2023-01-01T00:00:00Z", "name":"crash2"}
    ]
  }
  ```
+ ISO8601 日時形式のより大きなサブセットのサポート。以下の「」を参照してください。

サポートされる形式

 日時値の形式は [Date]T[Time][Timezone] であり、T は区切り文字です。明示的なタイムゾーンが指定されていない場合は、UTC (Z) がデフォルトとみなされます。

Timezone

サポートされているタイムゾーン形式は次のとおりです。
+ \$1/-HH:mm
+ \$1/-HHmm
+ \$1/-HH

 日時文字列にタイムゾーンを配置することは任意です。タイムゾーンオフセットが 0 の場合は、上記のタイムゾーンのプレフィックスの代わりに Z を使用して UTC 時間を指定できます。サポートされているタイムゾーンの範囲は -14:00 から \$114:00 です。

日付

タイムゾーンが存在しない場合、またはタイムゾーンが UTC (Z) の場合、サポートされている日付形式は次のとおりです。

**注記**  
DDD は、001 から 365 (うるう年については 366) までの年を表す序数の日付を指します。例えば、2024-002 は 2024 年 1 月 2 日を表します。
+ `yyyy-MM-dd`
+ `yyyyMMdd`
+ `yyyy-MM`
+ `yyyyMM`
+ `yyyy-DDD`
+ `yyyyDDD`
+ `yyyy`

Z 以外のタイムゾーンを選択した場合、サポートされている日付形式は次のように制限されます。
+ `yyyy-MM-dd`
+ `yyyy-DDD`
+ `yyyyDDD`

サポートされている日付の範囲は 1400-01-01～9999-12-31 です。

Time

タイムゾーンが存在しない場合、またはタイムゾーンが UTC (Z) の場合、サポートされている時間形式は次のとおりです。
+ `HH:mm:ss.SSS`
+ `HH:mm:ss`
+ `HHmmss.SSS`
+ `HHmmss`
+ `HH:mm`
+ `HHmm`
+ `HH`

Z 以外のタイムゾーンを選択した場合、サポートされている時間形式は次のように制限されます。
+ `HH:mm:ss`
+ `HH:mm:ss.SSS`

### Neptune openCypher 言語セマンティクスの違い
<a name="opencypher-compliance-semantics"></a>

Neptune は、ノードとリレーションシップ ID を整数ではなく文字列で表します。ID は、データローダーによって指定された ID と等しくなります。カラムに名前空間がある場合、名前空間に ID を加えたもの。よって、`id` 関数は、整数の代わりに文字列を返します。

`INTEGER` データ型は 64 ビットに制限されています。より大きな浮動小数点値または文字列値を整数に変換する場合`TOINTEGER` 関数、負の値は `LLONG_MIN` に切り捨てられ、正の値は `LLONG_MAX` に切り捨てられます。

例えば、次のようになります。

```
RETURN TOINTEGER(2^100)
>  9223372036854775807

RETURN TOINTEGER(-1 * 2^100)
>  -9223372036854775808
```

### 複数値プロパティ
<a name="openCypher-compliance-mvp"></a>

 openCypher CREATE は複数値のプロパティを作成しませんが、Gremlin (Neptune データベース) を使用して作成されたデータや、データのロード時 (Neptune データベースと Neptune Analytics) に存在できます。Neptune openCypher が複数値プロパティを検出すると、いずれかの値が任意に選択され、非決定的な結果が作成されます。

### NaN 値の処理
<a name="openCypher-compliance-handling-nan"></a>

 Neptune による `NaN` プロパティ値の比較処理は未定義です。このような比較に依存すると、予期しない結果や非決定的な結果になる可能性があります。