openCypher Amazon Neptune での仕様コンプライアンス - Amazon Neptune

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

openCypher Amazon Neptune での仕様コンプライアンス

の Amazon Neptune リリースでは、Cypher クエリ言語リファレンスバージョン 9 である現在の openCypher 仕様で で定義されている句、演算子、式、関数、構文が openCypher 一般的にサポートされています。の Neptune サポートの制限と相違 openCypher 点を以下に示します。

注記

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

Neptune での openCypher 句のサポート

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

  • MATCH – 以下を除く、サポートされています。shortestPath() また、allShortestPaths() は現在サポートされていません。

  • OPTIONAL MATCH

  • MANDATORY MATCH   – 現在、Neptune ではサポートされていません。ただし、Neptune は MATCH クエリでの カスタム ID 値をサポートしています。

  • 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 値を作成できます。

  • DELETE

  • SET

  • REMOVE

  • MERGE - Neptune は MERGE クエリでのカスタム ID 値をサポートしています。

  • CALL[YIELD...]   – 現在、Neptune ではサポートされていません。

  • UNION, UNION ALL — 読み取り専用クエリはサポートされていますが、ミューテーションクエリは現在サポートされていません

  • USING - エンジンバージョン 1.3.2.0 でサポートUSINGされています。詳細については、「クエリヒント」を参照してください。

Neptune での openCypher 演算子のサポート

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

一般的な演算子
  • DISTINCT

  • ネストされたリテラルマップのプロパティにアクセスするための . 演算子。

算術演算子
  • + 加算演算子。

  • - 減算演算子。

  • * 乗算演算子。

  • / 除算演算子。

  • % 剰余除算演算子。

  • ^ 指数演算子 is NOT supported.

比較演算子
  • = 加算演算子。

  • <> 不等式演算子。

  • < 小なり演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。

  • > 大なり演算子は、引数のいずれかが Path、List、または Map の場合を除いてサポートされます。

  • <= less-than-or-equal-to 演算子は、引数がパス、リスト、またはマップのいずれかである場合を除き、サポートされます。

  • >= greater-than-or-equal-to 演算子は、引数がパス、リスト、またはマップのいずれかである場合を除き、サポートされます。

  • IS NULL

  • IS NOT NULL

  • STARTS WITH は、検索するデータが文字列の場合にサポートされます。

  • ENDS WITH は、検索するデータが文字列の場合にサポートされます。

  • CONTAINS は、検索するデータが文字列の場合にサポートされます。

ブール演算子
  • AND

  • OR

  • XOR

  • NOT

文字列演算子
  • + 連結演算子。

演算子一覧
  • + 連結演算子。

  • IN (リスト内の項目の存在を確認します)

Neptune での openCypher 式のサポート

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

  • CASE

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

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

Neptune での openCypher 関数のサポート

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() (リスト内の文字列を 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() (リスト内の文字列を 1 つの文字列に連結する)

  • left()

  • lTrim()

  • replace()

  • reverse()

  • right()

  • rTrim()

  • split()

  • substring()

  • toLower()

  • toString()

  • toUpper()

  • trim()

ユーザー定義関数

User-defined functions は現在、Neptune ではサポートされていません。

Neptune 固有の openCypher 実装の詳細

以下のセクションでは、 の Neptune 実装がopenCypher 仕様 と異なる openCypher か、仕様 を超える方法について説明します。

Neptune での可変長パス (VLP) の評価

可変長パス (VLP) 評価は、グラフ内のノード間のパスを検出します。クエリではパスの長さに制限はありません。サイクルを防ぐために、openCypher 仕様では、各エッジをソリューションごとに最大 1 回トラバースする必要があることを指定します。

の場合VLPs、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 以下)

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

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

RETURN datetime() as res

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

サポートされている日付形式
  • 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 のすべての日付/時刻値はUTC、値として openCypher 保存および取得されることに注意してください。

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

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

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

Neptune は datetimeepochmillis に変換する epochmillis() 関数をサポートしています。例:

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

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

Neptune openCypher 実装での一時的なサポート (Neptune Analytics および Neptune Database 1.3.2.0 以降)

の次の日時機能は、Neptune Analytics OpenCypher に適用されます。または、Labmode パラメータを使用して、Neptune エンジンリリースバージョン 1.3.2.0 以降で次の日時機能DatetimeMillisecond=enabledを有効にすることもできます。ラボモードでこの機能を使用する方法の詳細については、「」を参照してください拡張日時サポート

  • ミリ秒のサポート。日時リテラルは、ミリ秒が 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() 関数の呼び出しのサポート。例えば、この機能の前には、次のクエリは実行できませんでした。

    プロパティの日時 ():

    // 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

    中間結果の日時 ():

    // Parse datetime from parameter UNWIND $list as myDate RETURN datetime(myDate) as d
  • 上記の場合、 で作成された日時のアクセス許可を保存できるようになりました。

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

    // 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) がデフォルトと見なされます。

タイムゾーン

サポートされているタイムゾーン形式は次のとおりです。

  • +/-HH:mm

  • +/-HHmm

  • +/-HH

日時文字列内のタイムゾーンの存在はオプションです。タイムゾーンオフセットが 0 の場合、上記のタイムゾーンのプレフィックスの代わりに Z を使用してUTC時間を示すことができます。サポートされているタイムゾーンの範囲は -14:00 から +14: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 です。

時間

タイムゾーンが存在しない場合、またはタイムゾーンが 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 言語セマンティクスの違い

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

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

例:

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

Neptune 固有の join() 関数

Neptune は、 openCypher 仕様に存在しないjoin()関数を実装します。文字列リテラルと文字列区切り文字のリストから文字列リテラルを作成します。2 つの引数を取ります。

  • 1 番目の引数は文字列リテラルのリストです。

  • 2 番目の引数は区切り文字列であり、0、1、または複数の文字で構成できます。

例:

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

Neptune 固有の removeKeyFromMap() 関数

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 値

エンジンリリース 1.2.0.2 以降、Neptune は 、CREATEMERGEおよび MATCH句でノードと関係idの値を指定できるように openCypher 仕様を拡張しました。これにより、ノードとリレーションシップを識別UUIDsするためにシステムによって生成された文字列ではなく、ユーザーフレンドリーな文字列を割り当てることができます。

警告

がリザーブドプロパティ名と見なされるようになったため、 openCypher 仕様に対するこの拡張~idは下位互換性がありません。~id をデータやクエリで既にプロパティとして使用している場合、既存のプロパティを新しいプロパティキーに移行して、古いものを削除する必要があります。「現在、~id をプロパティとして使用している場合の対処方法」を参照してください。

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

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 IDs 句でカスタムを使用する例を次に示します。

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 openCypher と Cypher のその他の違い

  • Neptune は、Bolt プロトコルTCPの接続のみをサポートします。 WebSockets Bolt の接続はサポートされていません。

  • Neptune はtrim()、、、 ltrim() rtrim()関数の Unicode で定義されているように空白 openCypher を削除します。

  • Neptune ではopenCypher、tostring(double) は double の大きな値に対して E 表記に自動的に切り替えられません。

  • は複数値のプロパティを作成しませんが openCypher CREATE、Gremlin を使用して作成されたデータに存在する可能性があります。Neptune が複数値プロパティ openCypher を検出すると、いずれかの値が任意選択され、非決定的な結果が作成されます。