openCypher Amazon Neptune 中的規格合規 - Amazon Neptune

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

openCypher Amazon Neptune 中的規格合規

的 Amazon Neptune 版本 openCypher 一般支援目前 openCypher 規格在 中定義的子句、運算子、運算式、函數和語法,也就是 Cypher Query 語言參考第 9 版。對 Neptune 支援的限制和差異 openCypher 如下所示。

注意

Cypher 目前的 Neo4j 實作包含上述 openCypher 規格中未包含的功能。如果您要將目前 Cypher 程式碼遷移至 Neptune,請參閱 Neptune 與 Neo4j 的相容性重寫 Cypher 查詢以在 Neptune 上的 OpenCpher 中執行 以取得詳細資訊。

支援 Neptune 中的 openCypher 子句

Neptune 支援下列子句,除非另有說明:

  • MATCH – 支援,但 shortestPath() 以及 allShortestPaths() 目前不受支援。

  • OPTIONAL MATCH

  • MANDATORY MATCH   – Neptune 目前不支援 。不過,Neptune 確實支援 MATCH 查詢中的自訂 ID 值

  • RETURN – 支援,但與 SKIPLIMIT 的非靜態值搭配使用時除外。例如,目前下列項目無法運作:

    MATCH (n) RETURN n LIMIT toInteger(rand()) // Does NOT work!
  • WITH – 支援,但與 SKIPLIMIT 的非靜態值搭配使用時除外。例如,目前下列項目無法運作:

    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支援 – 。 https://docs.aws.amazon.com/neptune/latest/userguide/engine-releases-1.3.2.0.html如需詳細資訊,請參閱查詢提示

支援 Neptune 中的 openCypher 運算子

Neptune 支援下列運算子,除非另有說明:

一般運算子
  • DISTINCT

  • 用於存取巢狀常值映射屬性的 . 運算子。

數學運算子
  • + 加法運算子。

  • - 減法運算子。

  • * 乘法運算子。

  • / 除法運算子。

  • % 模數除法運算子。

  • ^ 指數運算子 is NOT supported.

比較運算子
  • = 加法運算子。

  • <> 不等式運算子。

  • 支援 < 小於運算子,但其中一個引數是 Path、List 或 Map 除外。

  • 支援 > 大於運算子,但其中一個引數是 Path、List 或 Map 除外。

  • 支援 <= less-than-or-equal至運算子,除非其中一個引數是路徑、清單或映射。

  • 支援 >= greater-than-or-equal至運算子,除非其中一個引數是路徑、清單或映射。

  • 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() (將清單中的字串串連為單一字串)

  • 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() (將清單中的字串串連為單一字串)

  • 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 規格指定每個解決方案最多必須周遊一次。

對於 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 確實支援將 datetime 轉換為 epochmillisepochmillis() 函數。例如:

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() 函數。例如,在此功能之前,下列查詢是不可能的。

    透過屬性的日期時間 ():

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

    從具有 datetime 屬性的 參數批次建立節點:

    // 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()函數。它從字串常值清單和字串分隔符號中建立一個字串常值。它需要兩個引數:

  • 第一個引數是字串常值的清單。

  • 第二個引數是分隔符號,它可以由零個、一個或多個字元組成。

範例:

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

Neptune 特定 removeKeyFromMap() 函數

Neptune 會實作 openCypher 規格中不存在的removeKeyFromMap()函數。它從映射中刪除指定的索引鍵,並傳回產生的新映射。

函數需要兩個引數:

  • 第一個引數是要從中移除索引鍵的映射。

  • 第二個引數是要從映射中移除的索引鍵。

在您想要透過展開映射清單來設定節點或關係值的情況下,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子句中指定節點MERGE和關係id的值。這可讓您指派易於使用的字串,而不是系統產生的字串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 會 openCypher 移除 trim()ltrim()rtrim()函數中 Unicode 定義的空格。

  • 在 Neptune 中openCypher,tostring()值不會自動切換到雙值大值的 E 符號。

  • 雖然 openCypher CREATE 不會建立多值屬性,但它們可以存在於使用 Gremlin 建立的資料中。如果 Neptune openCypher 遇到多值屬性,則會任意選擇其中一個值,從而建立非確定性結果。