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 — 読み取り専用クエリはサポートされていますが、ミューテーションクエリは現在サポートされていません

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

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 データベース 1.3.2.0 以降)

の次の日時機能は、Neptune Analytics OpenCypher に適用されます。または、 ラボモードパラメータを使用して、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 は openCypher 、、CREATE、および MATCH句でノードと関係idの値を指定できるようにMERGE仕様を拡張しました。これにより、ノードと関係を識別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(do)uble は double の大きな値に対して E 表記に自動的に切り替わりません。

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