適用於 openCypher 使用者的 Spanner Graph 參考資料

本文件將 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;
      
空白結果。 空白結果。 結果:
src_id dst_id
16 20

將圖形元素做為查詢結果傳回

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 有兩個內建函式,可找出節點之間的最短路徑:shortestPathallShortestPath

  • 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...] 不支援。
CREATEDELETESETREMOVEMERGE 如需更多資訊,請參閱「變異」一節和「在 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 清單。
您無法在單一清單中混用 INTSTRING
ARRAY

複合類型

openCypher Spanner Graph
LIST ARRAYJSON
MAP STRUCTJSON

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 不支援。
節點和邊緣 .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

不支援。
模式做為運算式 size(pattern) 不支援。使用以下子查詢
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

屬性類型函式和運算式

類型 openCypher
函式或運算式
Spanner Graph
函式或運算式
純量 coalesce COALESCE
head ARRAY_FIRST
last ARRAY_LAST
size(list) ARRAY_LENGTH
size(string) LENGTH
timestamp UNIX_MILLIS(CURRENT_TIMESTAMP())
每個toFloattoInteger 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_SLICEARRAY_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
比較鏈
a < b < c

Spanner Graph 不支援比較鏈結。這相當於與 AND 連結的比對。
例如:

      a < b AND b < C
      

布林值 AND AND
OR OR
XOR
Spanner 圖不支援 XOR。使用 <> 編寫查詢。

例如:
      boolean_1 <> boolean_2
      

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_ARRAYARRAY_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});

MATCH (p:Person {id: 100}), (a:Account {id: 1000}) CREATE (p)-[:Owns {create_time: timestamp()}]->(a);
INSERT INTO
Person (id, name)
VALUES (100, "John");

INSERT INTO Account (id, is_blocked) VALUES (1000, FALSE);
INSERT INTO PersonOwnAccount (id, account_id, create_time) VALUES (100, 1000, CURRENT_TIMESTAMP());
使用查詢結果建立節點和邊
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;

後續步驟