翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon Neptune の openCypher 拡張機能
Amazon Neptune は openCypher 仕様リファレンスバージョン 9 をサポートしています。詳細については、Amazon Neptune の「Amazon Neptune における openCypher の仕様準拠」を参照してください。さらに、Amazon Neptune はここに記載されている機能をサポートしています。特定のバージョンが記載されていない限り、機能は Neptune データベースと Neptune Analytics で使用できます。
クエリ時間 S3 データアクセス
Neptune Database 1.4.7.0 以降で使用できます。
Neptune は、openCypher クエリ内で直接 Amazon S3 から CSV または Parquet データを読み取る neptune.read()関数をサポートしています。クエリを実行する前にデータをインポートするバルクローダーとは異なり、 はクエリ実行時に Amazon S3 データneptune.read()にアクセスします。
詳細なドキュメントについては、「」を参照してくださいneptune.read()。
Neptune 固有の join() 関数
Neptune データベースと Neptune Analytics で使用できます。
Neptune は openCypher 仕様にはない join() 関数を実装しています。文字列リテラルと文字列区切り文字のリストから文字列リテラルを作成します。2 つの引数を取ります。
1 番目の引数は文字列リテラルのリストです。
2 番目の引数は区切り文字列であり、0、1、または複数の文字で構成できます。
例:
join(["abc", "def", "ghi"], ", ") // Returns "abc, def, ghi"
Neptune 固有の removeKeyFromMap() 関数
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 値
Neptune データベース 1.2.0.2 以降、および Neptune Analytics で使用できます。
エンジンリリース 1.2.0.2 以降、Neptune は openCypher 仕様を拡張し、CREATE, MERGE, および MATCH 句でノードとリレーションシップの id 値を指定できるようになりました。これにより、システムによって生成された UUID の代わりに、ユーザーフレンドリーな文字列を割り当てて、ノードやリレーションシップを識別できるようになりました。
Neptune Analytics では、カスタム ID 値をエッジに使用することはできません。
警告
~id は、現在、予約済みのプロパティ名と見なされているため、openCypher 仕様に対するこの拡張は下位互換性がありません。~id をデータやクエリで既にプロパティとして使用している場合、既存のプロパティを新しいプロパティキーに移行して、古いものを削除する必要があります。「現在、~id をプロパティとして使用している場合の対処方法」を参照してください。
カスタム 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 をプロパティとして使用している場合の対処方法
エンジンリリース 1.2.0.2 では、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 サブクエリのサポート
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 サブクエリ内の変数の範囲
内部で使用される CALL サブクエリの前にある句の変数は、最初の WITH 句によってインポートする必要があります。通常の WITH 句とは異なり、変数のリストのみを配置することができますが、エイリアスは許可されず、DISTINCT、ORDER BY、WHERE、SKIP、または LIMIT と併用することはできません。
CALL サブクエリから返される変数
CALL サブクエリから出力される変数は、最後の RETURN 句で指定します。出力された変数は、CALL サブクエリの前にある変数と重複できないことに注意してください。
制限事項
現時点では、CALL サブクエリ内の更新はサポートされていません。
Neptune openCypher 関数
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] }] }
ソート関数
以下の各セクションでは、コレクションをソートする関数を定義します。これらの関数は (場合によってはオプションで) 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" } }] }] }
時間関数
一時関数は Neptune バージョン 1.4.5.0 以降で使用できます。
day
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
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
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 関数
Neptune データベース 1.4.6.0 以降、および Neptune Analytics で使用できます。
reduce()
削減は、実行中の合計または「アキュムレータ」と組み合わせることで、各リスト要素を順次処理します。初期値から始めて、各オペレーションの後にアキュムレータを更新し、その更新された値を次のイテレーションで使用します。
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 }] }