

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

# Amazon Neptune の openCypher 拡張機能
<a name="access-graph-opencypher-extensions"></a>

 Amazon Neptune は openCypher 仕様リファレンスバージョン 9 をサポートしています。詳細については、Amazon Neptune の「[Amazon Neptune における openCypher の仕様準拠](feature-opencypher-compliance.md)」を参照してください。さらに、Amazon Neptune はここに記載されている機能をサポートしています。特定のバージョンが記載されていない限り、機能は Neptune データベースと Neptune Analytics で使用できます。

## クエリ時間 S3 データアクセス
<a name="opencypher-compliance-neptune-read"></a>

Neptune Database 1.4.7.0 以降で使用できます。

Neptune は、openCypher クエリ内で直接 Amazon S3 から CSV または Parquet データを読み取る `neptune.read()`関数をサポートしています。クエリを実行する前にデータをインポートするバルクローダーとは異なり、 はクエリの実行時に Amazon S3 データ`neptune.read()`にアクセスします。

詳細なドキュメントについては、「」を参照してください[neptune.read()](access-graph-opencypher-21-extensions-s3-read.md)。

## Neptune 固有の `join()` 関数
<a name="opencypher-compliance-join-function"></a>

Neptune データベースと Neptune Analytics で使用できます。

Neptune は openCypher 仕様にはない `join()` 関数を実装しています。文字列リテラルと文字列区切り文字のリストから文字列リテラルを作成します。2 つの引数を取ります。
+ 1 番目の引数は文字列リテラルのリストです。
+ 2 番目の引数は区切り文字列であり、0、1、または複数の文字で構成できます。

例:

```
join(["abc", "def", "ghi"], ", ")    // Returns "abc, def, ghi"
```

## Neptune 固有の `removeKeyFromMap()` 関数
<a name="opencypher-compliance-removeKeyFromMap-function"></a>

Neptune データベースと Neptune Analytics で使用できます。

Neptune は openCypher 仕様にはない `removeKeyFromMap()` 関数を実装しています。指定されたキーをマップから削除し、生成された新しいマップを返します。

関数は 2 つの引数を取ります。
+ 最初の引数は、キーを削除するマップです。
+ 2 番目の引数は、マップから削除するキーです。

`removeKeyFromMap()` 関数は、マップのリストを巻き戻して、ノードやリレーションシップの値を設定したい場合に特に便利です。例えば、次のようになります。

```
UNWIND [{`~id`: 'id1', name: 'john'}, {`~id`: 'id2', name: 'jim'}] as val
CREATE (n {`~id`: val.`~id`})
SET n = removeKeyFromMap(val, '~id')
```

## ノードとリレーションシッププロパティのカスタム ID 値
<a name="opencypher-compliance-custom-ids"></a>

Neptune データベース 1.2.0.2 以降、および Neptune Analytics で使用できます。

[エンジンリリース 1.2.0.2](engine-releases-1.2.0.2.md) 以降、Neptune は openCypher 仕様を拡張し、`CREATE`, `MERGE`, および `MATCH` 句でノードとリレーションシップの `id` 値を指定できるようになりました。これにより、システムによって生成された UUID の代わりに、ユーザーフレンドリーな文字列を割り当てて、ノードやリレーションシップを識別できるようになりました。

Neptune Analytics では、カスタム ID 値をエッジに使用することはできません。

**警告**  
`~id` は、現在、予約済みのプロパティ名と見なされているため、openCypher 仕様に対するこの拡張は下位互換性がありません。`~id` をデータやクエリで既にプロパティとして使用している場合、既存のプロパティを新しいプロパティキーに移行して、古いものを削除する必要があります。「[現在、`~id` をプロパティとして使用している場合の対処方法](#opencypher-compliance-custom-ids-migrating)」を参照してください。

カスタム ID を持つノードとリレーションシップを作成する方法の例を次に示します。

```
CREATE (n {`~id`: 'fromNode', name: 'john'})
  -[:knows {`~id`: 'john-knows->jim', since: 2020}]
  ->(m {`~id`: 'toNode', name: 'jim'})
```

既に使用されているカスタム ID を作成しようとすると、Neptune は `DuplicateDataException` エラーをスローします。

`MATCH` 句でカスタム ID を使用する例を次に示します。

```
MATCH (n {`~id`: 'id1'})
RETURN n
```

`MERGE` 句でカスタム ID を使用する例を次に示します。

```
MATCH (n {name: 'john'}), (m {name: 'jim'})
MERGE (n)-[r {`~id`: 'john->jim'}]->(m)
RETURN r
```

### 現在、`~id` をプロパティとして使用している場合の対処方法
<a name="opencypher-compliance-custom-ids-migrating"></a>

[エンジンリリース 1.2.0.2](engine-releases-1.2.0.2.md) では、openCypher 句の `~id` キーは、プロパティではなく `id` として扱われるようになりました。つまり、`~id` という名前のプロパティがある場合、アクセスできなくなるということです。

`~id` プロパティを使用している場合、エンジンリリース `1.2.0.2` 以降にアップグレードする前にしなければならないことは、まず、既存の `~id` プロパティを新しいプロパティキーに移行し、`~id` プロパティを削除することです。例えば、次のクエリは、
+ すべてのノードに「newId」という名前の新しいプロパティを作成します。
+ 「\~id」プロパティの値を「newId」プロパティにコピーし、
+ データから「\~id」プロパティを削除します。

```
MATCH (n)
WHERE exists(n.`~id`)
SET n.newId = n.`~id`
REMOVE n.`~id`
```

データ内の、`~id` プロパティのあるリレーションシップについても同じことを行う必要があります。

また、`~id` プロパティを参照するクエリを使用している場合は、すべて変更する必要があります。例えば、次のクエリは、

```
MATCH (n)
WHERE n.`~id` = 'some-value'
RETURN n
```

次のように変わります。

```
MATCH (n)
WHERE n.newId = 'some-value'
RETURN n
```

## Neptune での CALL サブクエリのサポート
<a name="call-subquery-support"></a>

 Neptune データベース 1.4.1.0 以降、および Neptune Analytics で使用できます。

 Amazon Neptune は `CALL` サブクエリをサポートしています。`CALL` サブクエリは、`CALL` サブクエリへの入力ごとに分離されたスコープで実行されるメインクエリの一部です。

 例えば、グラフに人物、それらの人物の友人、住んでいた都市に関するデータが含まれているとします。`CALL` サブクエリを使用して、誰かの各友人が住んでいた 2 つの最大の都市を取得できます。

```
MATCH (person:Person)-[:knows]->(friend) 
CALL { 
  WITH friend 
  MATCH (friend)-[:lived_in]->(city) 
  RETURN city 
  ORDER BY city.population DESC
  LIMIT 2 
} 
RETURN person, friend, city
```

 この例では、`CALL { ... }` 内のクエリ部分は、前述の MATCH 句に一致する各 `friend` に対して実行されます。内部クエリが実行されると、`ORDER` 句と `LIMIT` 句は特定の友人が住んでいた都市に対してローカルであるため、友人ごとに (最大で) 2 つの都市を取得します。

 すべてのクエリ句は `CALL` サブクエリ内で使用できます。これには、ネストされた `CALL` サブクエリも含まれます。最初の `WITH` 句と出力される変数にはいくつかの制限があり、以下で説明します。

### CALL サブクエリ内の変数の範囲
<a name="variable-scope-inside-call-subquery"></a>

 内部で使用される `CALL` サブクエリの前にある句の変数は、最初の `WITH` 句によってインポートする必要があります。通常の `WITH` 句とは異なり、変数のリストのみを配置することができますが、エイリアスは許可されず、`DISTINCT`、`ORDER BY`、`WHERE`、`SKIP`、または `LIMIT` と併用することはできません。

### CALL サブクエリから返される変数
<a name="variables-returned-call-subquery"></a>

 `CALL` サブクエリから出力される変数は、最後の `RETURN` 句で指定します。出力された変数は、`CALL` サブクエリの前にある変数と重複できないことに注意してください。

### 制限事項
<a name="call-subquery-limitations"></a>

 現時点では、`CALL` サブクエリ内の更新はサポートされていません。

## Neptune openCypher 関数
<a name="opencypher-compliance-new-functions"></a>

 Neptune データベース 1.4.1.0 以降、および Neptune Analytics で使用できます。

**textIndexOf**

 `textIndexOf(text :: STRING, lookup :: STRING, from = 0 :: INTEGER?, to = -1 :: INTEGER?) :: (INTEGER?)` 

 オフセット `from` (包含) からオフセット `to` (除外) までの `text` の範囲で `lookup` の最初の出現のインデックスを返します。`to` が -1 の場合、範囲は `text` の最後まで続きます。インデックス作成はゼロベースであり、Unicode スカラー値 (非代理コードポイント) で表されます。

```
RETURN textIndexOf('Amazon Neptune', 'e')
{
  "results": [{
      "textIndexOf('Amazon Neptune', 'e')": 8
    }]
}
```

**collToSet**

 `collToSet(values :: LIST OF ANY?) :: (LIST? OF ANY?)` 

 元のリストの一意の要素のみを含む新しいリストを返します。元のリストの順序は**維持**されます (例: `[1, 6, 5, 1, 5]` は `[1, 6, 5]` を返します)。

```
RETURN collToSet([1, 6, 5, 1, 1, 5])
{
  "results": [{
      "collToSet([1, 6, 5, 1, 1, 5])": [1, 6, 5]
    }]
}
```

**collSubtract**

 `collSubtract(first :: LIST OF ANY?, second :: LIST OF ANY?) :: (LIST? OF ANY?)` 

 `second` の要素を除く `first` のすべての一意の要素が含まれる新しいリストを返します。

```
RETURN collSubtract([2, 5, 1, 0], [1, 5])
{
  "results": [{
      "collSubtract([2, 5, 1, 0], [1, 5])": [0, 2]
    }]
}
```

**collIntersection**

 `collIntersection(first :: LIST? OF ANY?, second :: LIST? OF ANY?) :: (LIST? OF ANY?)` 

 `first` と `second` の交差のすべての一意の要素を含む新しいリストを返します。

```
RETURN collIntersection([2, 5, 1, 0], [1, 5])
{
  "results": [{
      "collIntersection([2, 5, 1, 0], [1, 5])": [1, 5]
    }]
}
```

## ソート関数
<a name="sorting-functions"></a>

 以下の各セクションでは、コレクションをソートする関数を定義します。これらの関数は (場合によってはオプションで) `config` マップ引数、またはソートキーやソート方向を定義する複数のマップのリストを取得します。

```
{ key: STRING, order: STRING }
```

 `key` は値がソートに使用されるマッププロパティまたはノードプロパティのいずれかです。`order` は「`asc`」または「`desc`」 (大文字と小文字は区別されません) であり、それぞれ昇順または降順のソートを指定します。デフォルトでは、ソートは昇順で実行されます。

**collSort**

 `collSort(coll :: LIST OF ANY, config :: MAP?) :: (LIST? OF ANY?)` 

 `coll` 入力リストから要素を含む新しいソート済みリストを返します。

```
RETURN collSort([5, 3, 1], {order: 'asc'})
{
  "results": [{
      "collSort([5, 3, 1])": [1, 3, 5]
    }]
}
```

**collSortMaps**

 `collSortMaps(coll :: LIST OF MAP, config :: MAP) :: (LIST? OF ANY?)` 

 指定された `key` プロパティの値でソートされたマップのリストを返します。

```
RETURN collSortMaps([{name: 'Alice', age: 25}, {name: 'Bob', age: 35}, {name: 'Charlie', age: 18}], {key: 'age', order: 'desc'})
{
  "results": [{
      "x": [{
          "age": 35,
          "name": "Bob"
        }, {
          "age": 25,
          "name": "Alice"
        }, {
          "age": 18,
          "name": "Charlie"
        }]
    }]
}
```

**collSortMulti**

```
collSortMulti(coll :: LIST OF MAP?, 
configs = [] :: LIST OF MAP, 
limit = -1 :: INTEGER?, 
skip = 0 :: INTEGER?) :: (LIST? OF ANY?)
```

 指定された `key` プロパティの値でソートされたマップのリストを返します。オプションで制限とスキップを適用します。

```
RETURN collSortMulti([{name: 'Alice', age: 25}, {name: 'Bob', age: 35}, {name: 'Charlie', age: 18}], [{key: 'age', order: 'desc'}, {key:'name'}]) as x
{
  "results": [{
      "x": [{
          "age": 35,
          "name": "Bob"
        }, {
          "age": 25,
          "name": "Alice"
        }, {
          "age": 18,
          "name": "Charlie"
        }]
    }]
}
```

**collSortNodes**

 `collSortNodes(coll :: LIST OF NODE, config :: MAP) :: (LIST? OF NODE?)` 

 `coll` 入力リストのソートされたバージョンを返し、ノード要素をそれぞれの `key` プロパティの値でソートします。

```
create (n:person {name: 'Alice', age: 23}), (m:person {name: 'Eve', age: 21}), (o:person {name:'Bob', age:25})
{"results":[]}

match (n:person) with collect(n) as people return collSortNodes(people, {key: 'name', order: 'desc'})
{
  "results": [{
      "collSortNodes(people, 'name')": [{
          "~id": "e599240a-8c23-4337-8aa8-f603c8fb5488",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 21,
            "name": "Eve"
          }
        }, {
          "~id": "8a6ef785-59e3-4a0b-a0ff-389655a9c4e6",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 25,
            "name": "Bob"
          }
        }, {
          "~id": "466bc826-f47f-452c-8a27-6b7bdf7ae9b4",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 23,
            "name": "Alice"
          }
        }]
    }]
}

match (n:person) with collect(n) as people return collSortNodes(people, {key: 'age'})
{
  "results": [{
      "collSortNodes(people, '^age')": [{
          "~id": "e599240a-8c23-4337-8aa8-f603c8fb5488",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 21,
            "name": "Eve"
          }
        }, {
          "~id": "466bc826-f47f-452c-8a27-6b7bdf7ae9b4",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 23,
            "name": "Alice"
          }
        }, {
          "~id": "8a6ef785-59e3-4a0b-a0ff-389655a9c4e6",
          "~entityType": "node",
          "~labels": ["person"],
          "~properties": {
            "age": 25,
            "name": "Bob"
          }
        }]
    }]
}
```

## 時間関数
<a name="temporal-functions"></a>

 一時関数は Neptune バージョン [1.4.5.0](https://docs.aws.amazon.com/releases/release-1.4.5.0.xml) 以降で使用できます。

### day
<a name="temporal-functions-day"></a>

 `day(temporal :: (datetime | date)) :: (LONG)` 

 `datetime` または `date` の値から月の `day` を返します。`datetime` の場合: 値は、日を抽出する前に入力に基づいて UTC に正規化されます。`date` の場合: 日はタイムゾーンに基づいて抽出されます。

 `datetime` 入力は Neptune データベースと Neptune Analytics の両方で使用できます。

```
RETURN day(datetime('2021-06-03T01:48:14Z'))
{
  "results": [{
      "day(datetime('2021-06-03T01:48:14Z'))": 3
    }]
}
```

 ここで、`datetime` は UTC に正規化されるため、\+08:00 は 6 月 2 日に戻ります。

```
RETURN day(datetime('2021-06-03T00:00:00+08:00'))
{
  "results": [{
      "day(datetime('2021-06-03T00:00:00+08:00'))": 2
    }]
}
```

 `date` 入力は Neptune Analytics でのみ使用できます。

```
RETURN day(date('2021-06-03Z'))
{
  "results": [{
      "day(date('2021-06-03Z'))": 3
    }]
}
```

 `date` はタイムゾーンを保持し、6 月 3 日を維持します。

```
RETURN day(date('2021-06-03+08:00'))
{
  "results": [{
      "day(date('2021-06-03+08:00'))": 3
    }]
}
```

### month
<a name="temporal-functions-month"></a>

 `month(temporal :: (datetime | date)) :: (LONG)` 

 `datetime` または `date` の値 (1～12) から月を返します。`datetime` の場合: 値は月を抽出する前に入力に基づいて UTC に正規化されます。`date` の場合: 月はタイムゾーンに基づいて抽出されます。

 `datetime` 入力は Neptune データベースと Neptune Analytics の両方で使用できます。

```
RETURN month(datetime('2021-06-03T01:48:14Z'))
{
  "results": [{
      "month(datetime('2021-06-03T01:48:14Z'))": 6
    }]
}
```

 ここで、`datetime` は UTC に正規化されるため、\+08:00 は 5 月 31 日に戻ります。

```
RETURN month(datetime('2021-06-01T00:00:00+08:00'))
{
  "results": [{
      "month(datetime('2021-06-01T00:00:00+08:00'))": 5
    }]
}
```

 `date` 入力は Neptune Analytics でのみ使用できます。

```
RETURN month(date('2021-06-03Z'))
{
  "results": [{
      "month(date('2021-06-03Z'))": 6
    }]
}
```

 `date` はタイムゾーンを保持し、6 月 1 日を維持します。

```
RETURN month(date('2021-06-01+08:00'))
{
  "results": [{
      "month(date('2021-06-01+08:00'))": 6
    }]
}
```

### year
<a name="temporal-functions-year"></a>

 `year(temporal :: (datetime | date)) :: (LONG)` 

 `datetime` または `date` の値から年を返します。`datetime` の場合: 値は年を抽出する前に入力に基づいて UTC に正規化されます。`date` の場合: 年はタイムゾーンに基づいて抽出されます。

 `datetime` 入力は Neptune データベースと Neptune Analytics の両方で使用できます。

```
RETURN year(datetime('2021-06-03T01:48:14Z'))
{
  "results": [{
      "year(datetime('2021-06-03T01:48:14Z'))": 2021
    }]
}
```

 ここで、`datetime` は UTC に正規化されるため、\+08:00 は 2020 年 12 月 31 日に戻ります。

```
RETURN year(datetime('2021-01-01T00:00:00+08:00'))
{
  "results": [{
      "year(datetime('2021-01-01T00:00:00+08:00'))": 2020
    }]
}
```

 `date` 入力は Neptune Analytics でのみ使用できます。

```
RETURN year(date('2021-06-03Z'))
{
  "results": [{
      "year(date('2021-06-03Z'))": 2021
    }]
}
```

 `date` はタイムゾーンを保持し、2021 年 6 月を維持します。

```
RETURN year(date('2021-01-01+08:00'))
{
  "results": [{
      "year(date('2021-01-01+08:00'))": 2021
    }]
}
```

### Neptune openCypher 関数
<a name="openCypher-functions"></a>

 Neptune データベース 1.4.6.0 以降、および Neptune Analytics で使用できます。

#### reduce()
<a name="openCypher-functions-reduce"></a>

 削減は、実行中の合計または「アキュムレータ」と組み合わせることで、各リスト要素を順次処理します。初期値から始めて、各オペレーションの後にアキュムレータを更新し、その更新された値を次のイテレーションで使用します。

 `for i in (0, ..., n) acc = acc X list[I], where X denotes any binary operator` 

 すべての要素が処理されると、最終的な累積結果が返されます。

 一般的な reduce() 構造 – `reduce(accumulator = initial , variable IN list | expression)` 

**タイプ仕様:**  
 `- initial: starting value for the accumulator :: (Long | FLOAT | STRING | LIST? OF (STRING, LONG, FLOAT)) - list: the input list :: LIST OF T where T matches initial type - variable :: represents each element in the input list - expression :: Only supports '+' and '*' operator - return :: Same type as initial ` 

**制限:**  
 現在、`reduce()` 式は次の対象のみをサポートしています。
+  数値乗算 
+  数値の追加 
+  文字列の連結 
+  リストの連結 

 これらは `+` または `*` の演算子で表されます。式は、以下に示すようにバイナリ式であることが必要 – `expression pattern: accumulator + any variable or accumulator * any variable` 

**オーバーフロー処理:**  
 Neptune は `reduce()` の評価中に数値オーバーフローを検出し、データ型に基づいて異なる応答を行います。

```
LONG (signed 64‑bit)
--------------------
• Valid range: –9 223 372 036 854 775 808 … 9 223 372 036 854 775 807  
• If any intermediate or final value falls outside this range,
  Neptune aborts the query with long overflow error message.
  
FLOAT (IEEE‑754 double)
-----------------------
• Largest finite value ≈ 1.79 × 10^308  
• Larger results overflow to INF
  Once `INF` is produced, it propagates through the remainder
  of the reduction.
```

**例:**  
reduce() 関数については、次の例を参照してください。

```
1. Long Addition:
RETURN reduce(sum = 0, n IN [1, 2, 3] | sum + n)
{
  "results": [{
      "reduce(sum = 0, n IN [1, 2, 3] | sum + n)": 6
    }]
}

2. String Concatenation:
RETURN reduce(str = "", x IN ["A", "B", "C"] | str + x) 
{
  "results": [{
      "reduce(str = "", x IN ["A", "B", "C"] | str + x)": "ABC"
    }]
}

3. List Combination:
RETURN reduce(lst = [], x IN [1, 2, 3] | lst + x)
{
  "results": [{
      "reduce(lst = [], x IN [1, 2, 3] | lst + x)": [1, 2, 3]
    }]
}

4. Float Addition:
RETURN reduce(total = 0.0, x IN [1.5, 2.5, 3.5] | total + x) 
{
  "results": [{
      "reduce(total = 0.0, x IN [1.5, 2.5, 3.5] | total + x)": 7.5
    }]
}

5. Long Multiplication:
RETURN reduce(product = 1, n IN [1, 2, 3] | product * n)
{
  "results": [{
      "reduce(product = 0, n IN [1, 2, 3] | product * n)": 6
    }]
}

6. Float Multiplication:
RETURN reduce(product = 1.0, n IN [1.5, 2.5, 3.5] | product * n)
{
  "results": [{
      "reduce(product = 1.0, n IN [1.5, 2.5, 3.5] | product * n)": 13.125
    }]
}

7. Long Overflow (Exception):
RETURN reduce(s = 9223372036854775807, x IN [2, 3] | s * x) AS result
{
"results": [{
    "reduce(s = 9223372036854775807, x IN [2, 3] | s * x) AS result": long overflow
    }]
}

8. Float Overflow:
RETURN reduce(s = 9.0e307, x IN [8.0e307, 1.0e307] | s + x) AS result
{
"results": [{
    "reduce(s = 9.0e307, x IN [8.0e307, 1.0e307] | s + x) AS result": INF
    }]
}
```