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

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

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

openCypher の Amazon Neptune リリースでは、通常、Cypher クエリ言語リファレンスバージョン 9 である current openCypher 仕様によって で定義された句、演算子、式、関数、構文がサポートされています。 https://s3.amazonaws.com/artifacts.opencypher.org/openCypher9.pdf openCypher の Neptune サポートの制限と相違点を以下に示します。

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

注記

Cypher の現在の Neo4j 実装には、上記の 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

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

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

  • - 減算演算子。

  • * 乗算演算子。

  • / 除算演算子。

  • % 剰余除算演算子。

  • ^ 指数演算子 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 での for 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 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 以降)

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

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

例えば:

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

複数値プロパティ

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