本文件將 openCypher 和 Spanner Graph 進行比較,比較項目如下:
- 術語
- 資料模型
- 結構定義
- 查詢
- 更改
本文件假設您已熟悉 openCypher v9。
事前準備
使用 Google Cloud 控制台設定及查詢 Spanner Graph。
術語
openCypher | Spanner Graph |
---|---|
節點 | 節點 |
關係 | 邊 |
節點標籤 | 節點標籤 |
關係類型 | 邊緣標籤 |
子句 | Spanner Graph 會使用 statement 這個字詞代表完整的執行單元,並使用 clause 這個字詞代表陳述式的修飾符。例如, MATCH 是陳述式,而 WHERE 是子句。 |
關係唯一性 openCypher 不會在單一比對結果中傳回重複的邊。 |
TRAIL 路徑如果希望在 Spanner 圖中使用唯一值,請使用 TRAIL 模式,在單一比對結果中傳回唯一邊。 |
符合標準
Spanner Graph 採用 ISO Graph Query Language (GQL) 和 SQL/Property Graph Queries (SQL/PGQ) 標準。
資料模型
Spanner Graph 和 openCypher 都採用屬性圖形資料模型,但兩者之間有些差異。
openCypher | Spanner Graph |
---|---|
每個關係都只有一個關係類型。 |
節點和邊都會有一或多個標籤。 |
結構定義
openCypher | Spanner Graph |
---|---|
圖表沒有預先定義的結構定義。 | 您必須使用 CREATE PROPERTY GRAPH 陳述式明確定義圖表結構。標籤會在結構定義中靜態定義。如要更新標籤,您必須更新結構定義。 詳情請參閱「建立、更新或刪除 Spanner 圖表結構定義」。 |
查詢
Spanner Graph 查詢功能與 openCypher 的功能類似。本節將說明 Spanner Graph 和 openCypher 之間的差異。
指定圖表
在 openCypher 中,有一個預設圖表,查詢會在預設圖表上運作。在 Spanner Graph 中,您可以定義多個圖表,且查詢必須以 GRAPH
子句開頭,才能指定要查詢的圖表。例如:
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name;
詳情請參閱圖表查詢語法。
圖表模式比對
Spanner Graph 支援類似 openCypher 的圖形模式比對功能。我們將在以下各節說明兩者的差異。
關係的唯一性和 TRAIL 模式
openCypher 不會在單一比對中傳回重複邊的結果,這在 openCypher 中稱為關係唯一性。在 Spanner Graph 中,系統預設會傳回重複的邊緣。如需唯一性,請使用 TRAIL
模式,確保單一比對結果中不存在重複邊緣。如要瞭解 TRAIL
和其他路徑模式的詳細語意,請參閱「路徑模式」。
以下範例說明查詢結果如何隨著 TRAIL
模式而變更:
- openCypher 和 Spanner 圖表
TRAIL
模式查詢會傳回空白結果,因為唯一可能的路徑是重複t1
兩次。 - 根據預設,Spanner Graph 查詢會傳回有效路徑。
openCypher | Spanner Graph (TRAIL 模式) | Spanner Graph (預設模式) | ||||
---|---|---|---|---|---|---|
MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH TRAIL (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]->(dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
GRAPH FinGraph MATCH (src:Account)-[t1:Transfers]-> (dst:Account)-[t2:Transfers]-> (src)-[t1]-> (dst) WHERE src.id = 16 RETURN src.id AS src_id, dst.id AS dst_id; |
||||
空白結果。 | 空白結果。 | 結果:
|
將圖形元素做為查詢結果傳回
openCypher | Spanner Graph |
---|---|
MATCH (account:Account) WHERE account.id = 16 RETURN account; |
GRAPH FinGraph MATCH (account:Account) WHERE account.id = 16 RETURN TO_JSON(account) AS account; |
在 Spanner Graph 中,查詢結果不會傳回圖形元素。使用 TO_JSON
函式將圖表元素以 JSON 格式傳回。
變長度模式比對和模式量化
在 openCypher 中,變長模式比對稱為 Spanner 圖中的路徑量化。路徑量化會使用不同的語法,如以下範例所示。詳情請參閱「量化路徑模式」。
openCypher | Spanner Graph |
---|---|
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
GRAPH FinGraph MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account) WHERE src.id = 16 RETURN dst.id ORDER BY dst.id; |
變長模式:元素清單
Spanner Graph 可讓您直接存取路徑量化中使用的變數。在以下範例中,Spanner 圖中的 e
與 openCypher 中的 edges(p)
相同。
openCypher | Spanner Graph |
---|---|
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account) WHERE src.id = 16 RETURN edges(p); |
GRAPH FinGraph MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account) WHERE src.id = 16 RETURN TO_JSON(e) AS e; |
最短路徑
openCypher 有兩個內建函式,可找出節點之間的最短路徑:shortestPath
和 allShortestPath
。
shortestPath
會找出節點之間的單一最短路徑。allShortestPath
會找出節點之間的所有最短路徑。可能會有多個長度相同的路徑。
Spanner Graph 使用不同的語法來找出節點之間的單一最短路徑:ANY SHORTEST
代表 shortestPath.
。Spanner Graph 不支援 allShortestPath
函式。
openCypher | Spanner Graph |
---|---|
MATCH (src:Account {id: 7}), (dst:Account {id: 20}), p = shortestPath((src)-[*1..10]->(dst)) RETURN length(p) AS path_length; |
GRAPH FinGraph MATCH ANY SHORTEST (src:Account {id: 7})-[e:Transfers]->{1, 3} (dst:Account {id: 20}) RETURN ARRAY_LENGTH(e) AS path_length; |
陳述式和子句
下表列出 openCypher 子句,並指出 Spanner 圖是否支援這些子句。
openCypher | Spanner Graph | |
---|---|---|
MATCH |
支援。詳情請參閱圖表模式比對。 | |
OPTIONAL MATCH |
支援。詳情請參閱圖表模式比對。 | |
RETURN / WITH |
支援。詳情請參閱
RETURN 陳述式和
WITH 陳述式。Spanner Graph 需要為複雜的運算式建立明確的別名。 |
|
支援。 |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
:不支援。 |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE |
支援。詳情請參閱 圖表模式的定義。 | |
ORDER BY |
支援。詳情請參閱
ORDER BY 聲明。 |
|
SKIP / LIMIT |
支援。詳情請參閱
SKIP 陳述式和
LIMIT 陳述式。Spanner Graph 需要偏移量和限制的常數運算式。 |
|
支援。 |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
:不支援。 |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION |
支援。詳情請參閱「複合式圖表查詢」。 | |
UNION ALL |
支援。詳情請參閱「複合式圖表查詢」。 | |
UNWIND |
FOR 聲明支援。 |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
不支援。 | |
CALL[YIELD...] |
不支援。 | |
CREATE 、DELETE 、SET 、REMOVE 、MERGE |
如需更多資訊,請參閱「變異」一節和「在 Spanner 圖表中插入、更新或刪除資料」。 |
資料類型
Spanner Graph 支援所有 GoogleSQL 資料類型。詳情請參閱「GoogleSQL 中的資料類型」。
以下各節會比較 openCypher 資料類型和 Spanner 圖資料類型。
結構類型
openCypher | Spanner Graph |
---|---|
節點 | 節點 |
Edge | Edge |
路徑 | 路徑 |
屬性類型
openCypher | Spanner Graph |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST 簡單型類型的同質清單。 例如: INT 清單、STRING 清單。您無法在單一清單中混用 INT 和 STRING 。 |
ARRAY |
複合類型
openCypher | Spanner Graph |
---|---|
LIST |
ARRAY 或 JSON |
MAP |
STRUCT 或 JSON |
Spanner Graph 不支援不同類型的異質清單,或動態鍵清單和異質元素值類型的對應項目。請針對這些用途使用 JSON。
型別強制轉換
openCypher | Spanner Graph |
---|---|
INT -> FLOAT |
支援。 |
如要進一步瞭解類型轉換規則,請參閱「GoogleSQL 中的轉換規則」。
函式和運算式
除了圖表函式和運算式之外,Spanner 圖表也支援所有 GoogleSQL 內建函式和運算式。
本節列出 openCypher 函式和運算式,以及在 Spanner 圖表中的等價項目。
結構型類型函式和運算式
類型 | openCypher 函式或運算式 |
Spanner Graph 函式或運算式 |
|
---|---|---|---|
節點和邊緣 |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (傳回整數) |
不支援。 | ||
properties |
TO_JSON |
||
keys (屬性類型名稱,但不是屬性值) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
不支援。 | |
startNode |
不支援。 | ||
type |
LABELS |
||
路徑 | length |
不支援。 | |
nodes |
不支援。 | ||
relationships |
不支援。 | ||
節點和邊緣 | .
|
. |
|
[]
|
不支援。 | ||
模式做為運算式 | size(pattern) |
不支援。使用以下子查詢
|
屬性類型函式和運算式
類型 | openCypher 函式或運算式 |
Spanner Graph 函式或運算式 |
|
---|---|---|---|
純量 | coalesce |
COALESCE |
|
head |
ARRAY_FIRST |
||
last |
ARRAY_LAST |
||
size(list) |
ARRAY_LENGTH |
||
size(string) |
LENGTH |
||
timestamp |
UNIX_MILLIS(CURRENT_TIMESTAMP()) |
||
每個toFloat 每toInteger toBoolean |
CAST(expr AS type) |
||
匯總 | avg |
AVG |
|
collect |
ARRAY_AGG |
||
count
| COUNT |
||
max |
MAX |
||
min |
MIN |
||
percentileCont |
PERCENTILE_CONT |
||
percentileDisc |
PERCENTILE_DISC |
||
stDev |
STDDEV |
||
stDevP |
不支援。 | ||
sum |
SUM |
||
清單 | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
Spanner Graph 不支援 tail 。請改用 ARRAY_SLICE 和 ARRAY_LENGTH 。 |
||
數學 | abs |
ABS |
|
ceil |
CEIL |
||
floor |
FLOOR |
||
rand |
RAND |
||
round |
ROUND |
||
sign |
SIGN |
||
e |
EXP(1) |
||
exp |
EXP |
||
log |
LOG |
||
log10 |
LOG10 |
||
sqrt |
SQRT |
||
acos |
ACOS |
||
asin |
ASIN |
||
atan |
ATAN |
||
atan2 |
ATAN2 |
||
cos |
COS |
||
cot |
COT |
||
degrees |
r * 90 / ASIN(1) |
||
pi |
ACOS(-1) |
||
radians |
d * ASIN(1) / 90 |
||
sin |
SIN |
||
tan |
TAN |
||
字串 | left |
LEFT |
|
ltrim |
LTRIM |
||
replace |
REPLACE |
||
reverse |
REVERSE |
||
right |
RIGHT |
||
rtrim |
RTRIM |
||
split |
SPLIT |
||
substring |
SUBSTR |
||
tolower |
LOWER |
||
tostring |
CAST(expr AS STRING) |
||
toupper |
UPPER |
||
trim |
TRIM |
||
DISTINCT | DISTINCT |
DISTINCT |
|
數學 | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
比較 | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
比較鏈
|
Spanner Graph 不支援比較鏈結。這相當於與 AND 連結的比對。例如:
|
||
布林值 | AND |
AND |
|
OR |
OR |
||
XOR |
Spanner 圖不支援 XOR 。使用 <> 編寫查詢。例如:
|
||
NOT |
NOT |
||
字串 | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
清單 | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
其他運算式
openCypher | Spanner Graph |
---|---|
情況運算式 | 支援。 |
Exists 子查詢 | 支援。 |
地圖投影 | 不支援。STRUCT 類型提供類似功能。 |
清單運算 | 不支援。GENERATE_ARRAY 和 ARRAY_TRANSFORM 可滿足大多數用途。 |
查詢參數
下列查詢顯示在 openCypher 和 Spanner 圖表中使用參數的差異。
openCypher | Spanner Graph | |
---|---|---|
參數 | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
更改
Spanner 圖形會使用 GoogleSQL DML 變更節點和邊緣輸入資料表。詳情請參閱「插入、更新或刪除 Spanner 圖表資料」。
建立節點和邊
openCypher | Spanner Graph | |
---|---|---|
建立節點和邊 | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
使用查詢結果建立節點和邊 |
MATCH (a:Account {id: 1}), (oa:Account) WHERE oa <> a CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa); |
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount) SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100 FROM GRAPH_TABLE( FinGraph MATCH (a:Account {id:1000}), (oa:Account) WHERE oa <> a ); |
在 Spanner Graph 中,標籤會根據 CREATE PROPERTY GRAPH
DDL 陳述式靜態指派。
更新節點和邊
openCypher | Spanner Graph | |
---|---|---|
更新屬性 | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
如要更新 Spanner Graph 標籤,請參閱「建立、更新或刪除 Spanner Graph 結構定義」。
合併節點和邊
openCypher | Spanner Graph | |
---|---|---|
插入新元素或更新屬性 | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
刪除節點和邊
刪除邊緣的操作與刪除輸入表格相同。
openCypher | Spanner Graph | |
---|---|---|
刪除節點和邊 | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
刪除節點時,需要處理可能的懸掛邊緣。指定 DELETE CASCADE
後,DELETE
會移除節點的相關聯邊,例如 openCypher 中的 DETACH DELETE
。詳情請參閱 Spanner 結構定義總覽。
openCypher | Spanner Graph | |
---|---|---|
刪除節點和相關聯的邊 | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
傳回變異結果
openCypher | Spanner Graph | |
---|---|---|
在插入或更新後傳回結果 | MATCH (p:Person {id: 100}) SET p.country = 'United States' RETURN p.id, p.name; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100 THEN RETURN id, name; |
刪除後傳回結果 | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |