本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
openCypher Amazon Neptune 中的規格合規
的 Amazon Neptune 版本 openCypher 一般支援目前 openCypher 規格在 中定義的子句、運算子、運算式、函數和語法,也就是 Cypher Query 語言參考第 9 版
注意
Cypher 目前的 Neo4j 實作包含上述 openCypher 規格中未包含的功能。如果您要將目前 Cypher 程式碼遷移至 Neptune,請參閱 Neptune 與 Neo4j 的相容性 和 重寫 Cypher 查詢以在 Neptune 上的 OpenCpher 中執行 以取得詳細資訊。
支援 Neptune 中的 openCypher 子句
Neptune 支援下列子句,除非另有說明:
MATCH
– 支援,但
以及shortestPath()
目前不受支援。allShortestPaths()
OPTIONAL MATCH
– Neptune 目前不支援 。不過,Neptune 確實支援MANDATORY MATCH
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 值。
– Neptune 目前不支援 。CALL[YIELD...]
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
日期和時間值可從 "
dateT
time"
格式的字串中剖析而來,其中 date 和 time 皆以下面的其中一種支援形式表示:
支援的日期格式
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
轉換為 epochmillis
的 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() 函數。例如,在此功能之前,下列查詢是不可能的。
透過屬性的日期時間 ():
// 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 遇到多值屬性,則會任意選擇其中一個值,從而建立非確定性結果。