本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon Neptune 中的 openCypher 規格合規
OpenCypher 的 Amazon Neptune 版本通常支援目前 OpenCypher 規格 (即 Cypher 查詢語言參考第 9 版
Amazon Neptune 也支援 openCypher 規格範圍以外的多種功能。請參閱 Amazon Neptune 中的 openCypher 延伸模組 以取得詳細資訊。
注意
Cypher 的目前 Neo4j 實作包含了上述 OpenCypher 規格中未包含的功能。如果您要將目前 Cypher 程式碼遷移至 Neptune,請參閱 Neptune 與 Neo4j 的相容性 和 重寫 Cypher 查詢以在 Neptune 上的 OpenCpher 中執行 以取得詳細資訊。
Neptune 中對 openCypher 子句的支援
Neptune 支援下列子句,除非另有說明:
MATCH– 支援,但目前不支援和shortestPath()。allShortestPaths()OPTIONAL MATCH– 目前在 Neptune 中不支援。不過,Neptune 確實支援MANDATORY MATCHMATCH查詢中的自訂 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! UNWINDWHEREORDER BYSKIPLIMITCREATE– Neptune 可讓您在CREATE查詢中建立自訂 ID 值。DELETESETREMOVEMERGE– Neptune 支援MERGE查詢中的自訂 ID 值。– 目前在 Neptune 中不支援。CALL[YIELD...]UNION, UNION ALL– 支援唯讀查詢,但目前不支援變動查詢。-
USING–USING支援引擎 1.3.2.0 版。如需詳細資訊,請參閱查詢提示。
Neptune 中對 openCypher 運算子的支援
Neptune 支援下列運算子,除非另有說明:
一般運算子
DISTINCT用於存取巢狀常值映射屬性的
.運算子。
數學運算子
+加法運算子。-減法運算子。*乘法運算子。/除法運算子。%模數除法運算子。^指數運算子未受支援。
比較運算子
=加法運算子。<>不等式運算子。支援
<小於運算子,但其中一個引數是 Path、List 或 Map 除外。支援
>大於運算子,但其中一個引數是 Path、List 或 Map 除外。支援
<=小於或大於運算子,但其中一個引數是 Path、List 或 Map 除外。支援
>=大於或等於運算子,但其中一個引數是 Path、List 或 Map 除外。IS NULLIS NOT NULL如果要搜尋的資料是字串,則支援
STARTS WITH。如果要搜尋的資料是字串,則支援
ENDS WITH。如果要搜尋的資料是字串,則支援
CONTAINS。
布林值運算子
ANDORXORNOT
字串運算子
+串連運算子。
清單運算子
+串連運算子。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()removeKeyFromMapsize()– 此過載方法目前僅適用於模式運算式、清單和字串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()
使用者定義的函數
Neptune 中目前不支援使用者定義的函數。
Neptune 特定的 openCypher 實作詳細資訊
以下各節描述了其中 OpenCypher 的 Neptune 實作可能不同於或超出 OpenCypher 規格
Neptune 中的可變長度路徑(VLP)評估
可變長度路徑 (VLP) 評估會探索圖形中節點之間的路徑。路徑長度可在查詢中不受限制。為了防止循環,OpenCypher 規格
對於 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" 格式的字串中剖析而來,其中 date 和 time 皆以下面的其中一種支援形式表示:
支援的日期格式
yyyy-MM-ddyyyyMMddyyyy-MMyyyy-DDDyyyyDDDyyyy
支援的時間格式
HH:mm:ssZHHmmssZHH:mm:ssZHH:mmZHHmmZHHZHHmmssHH:mm:ssHH:mmHHmmHH
例如:
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 轉換為 epochmillis 的 epochmillis() 函數。例如:
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-ddyyyyMMddyyyy-MMyyyyMMyyyy-DDDyyyyDDDyyyy
如果選擇 Z 以外的時區,支援的日期格式會限制如下:
yyyy-MM-ddyyyy-DDDyyyyDDD
日期的支援範圍是從 1400-01-01 到 9999-12-31。
時間
如果沒有時區,或時區為 UTC (Z),則支援的時間格式為:
HH:mm:ss.SSSHH:mm:ssHHmmss.SSSHHmmssHH:mmHHmmHH
如果選擇 Z 以外的時區,則支援的時間格式限制如下:
HH:mm:ssHH: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 遇到一個多值屬性,其中一個值是任意選擇的,這會建立一個非確定性的結果。
NaN valuse 的處理
Neptune 對NaN屬性值比較的處理方式未定義。依賴這類比較可能會導致非預期或非確定性的結果。