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

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

openCypher Amazon Neptune 中的規格合規

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

Amazon Neptune 也支援超出 openCypher 規格範圍的多種功能。請參閱 openCypher Amazon Neptune 中的擴充功能 以取得詳細資訊。

注意

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

支援 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 – 支援唯讀查詢,但目前支援變動查詢。

  • USINGUSING 支援引擎 1.3.2.0 版。如需詳細資訊,請參閱查詢提示

支援 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 資料庫 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

多值屬性

雖然 openCypher CREATE 不會建立多值屬性,但它們可以存在於使用 Gremlin (Neptune 資料庫) 建立的資料中,或在載入資料 (Neptune 資料庫和 Neptune Analytics) 時存在。如果 Neptune openCypher 遇到多值屬性,則會任意選擇其中一個值,建立非確定性結果。