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

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

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

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

Amazon Neptune はopenCypher 仕様の範囲を超えるいくつかの機能もサポートしています。詳細については、「Amazon Neptune の openCypher 拡張機能」を参照してください。

注記

現在の Neo4j の Cypher 実装には、上記の openCypher 仕様には含まれていない機能が含まれています。現在の Cypher コードを Neptune に移行する場合、詳細については, 「Neptune の Neo4j との互換性」と「Neptune で in 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

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

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

  • - 減算演算子。

  • * 乗算演算子。

  • / 除算演算子。

  • % 剰余除算演算子。

  • ^ 指数演算子はサポート対象外です。

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

  • <> 不等式演算子。

  • < 小なり演算子は、引数のいずれかが 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 式のサポート

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()

ユーザー定義関数

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

Neptune 固有の openCypher 実装の詳細

以下のセクションでは、openCypher の Neptune 実装が openCypher 仕様と異なる場合や、それを超える場合があることについて説明します。

Neptune における可変長パス (VLP) 評価

可変長パス (VLP) 評価は、グラフ内のノード間のパスを検出します。クエリではパスの長さに制限はありません。サイクルを防ぐため、openCypher 仕様は、各エッジはソリューションごとに最大 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 以前)

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

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

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 以降) での一時的なサポート

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

  • ミリ秒のサポート。日時リテラルは、ミリ秒が 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
  • 上記の場合、 で作成された日時のアクセス許可を保存できるようになりました。

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

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

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

以下に例を示します。

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

複数値のプロパティ

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