במסמך הזה מוצגת השוואה בין openCypher לבין Spanner Graph בדרכים הבאות:
- הסברים על המונחים
- מודל נתונים
- סכימה
- שאילתה
- מוטציה
המסמך הזה מבוסס על ההנחה שאתם מכירים את openCypher v9.
לפני שמתחילים
הגדרה של Spanner Graph והפעלת שאילתות באמצעות מסוף Google Cloud
הסברים על המונחים
| openCypher | Spanner Graph |
|---|---|
| צמתים | צמתים |
| קרובי משפחה | קצוות |
| תוויות של צמתים | תוויות של צמתים |
| סוגי קשרים | תוויות של קצוות |
| סעיפים | ב-Spanner Graph, המונח statement מתייחס ליחידה שלמה של ביצוע, והמונח clause מתייחס למשנה של הצהרות.לדוגמה, MATCH הוא משפט, ואילו WHERE הוא פסקה. |
| ייחודיות של קשרים openCypher לא מחזירה תוצאות עם קצוות חוזרים בהתאמה אחת. |
TRAIL pathאם רוצים לקבל תוצאות ייחודיות ב-Spanner Graph, צריך להשתמש ב- TRAIL mode כדי להחזיר קשתות ייחודיות בהתאמה אחת.
|
עמידה בתקנים
Spanner Graph מאמץ את התקנים של Graph Query Language (GQL) ושל SQL/Property Graph Queries (SQL/PGQ) בהתאם לתקן ISO.
מודל נתונים
גם Spanner Graph וגם openCypher משתמשים במודל נתוני גרף המאפיינים, אבל יש ביניהם כמה הבדלים.
| openCypher | Spanner Graph |
|---|---|
|
לכל קשר גומלין יש בדיוק סוג אחד של קשר. |
לצמתים ולקשתות יש תווית אחת או יותר. |
סכימה
| openCypher | Spanner Graph |
|---|---|
| לתרשים אין סכימה מוגדרת מראש. | צריך להגדיר סכימת גרף באופן מפורש באמצעות הצהרת CREATE PROPERTY GRAPH.התוויות מוגדרות באופן סטטי בסכימה. כדי לעדכן תוויות, צריך לעדכן את הסכימה. מידע נוסף זמין במאמר יצירה, עדכון או הסרה של סכימת Spanner Graph. |
שאילתה
יכולות השאילתות של 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 Graph
TRAILמחזירות תוצאות ריקות כי הנתיב האפשרי היחיד הוא לחזור עלt1פעמיים. - כברירת מחדל, שאילתת Spanner Graph מחזירה נתיב תקין.
| openCypher | Spanner Graph (מצב ניסיון) | 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 Graph. בכימות נתיבים משתמשים בתחביר שונה, כמו בדוגמה הבאה. מידע נוסף מופיע במאמר בנושא דפוס נתיב כמותי.
| 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 מאפשר לכם לגשת ישירות למשתנים שמשמשים לכימות נתיבים. בדוגמה הבאה, e ב-Spanner Graph זהה ל-edges(p) ב-openCypher.
| 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. הפונקציה allShortestPath לא נתמכת ב-Spanner Graph.
| 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 Graph.
| 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 Graph. | |
סוגי נתונים
Spanner Graph תומך בכל סוגי הנתונים של GoogleSQL. מידע נוסף זמין במאמר סוגי נתונים ב-GoogleSQL.
בקטעים הבאים מוצגת השוואה בין סוגי הנתונים ב-openCypher לבין סוגי הנתונים ב-Spanner Graph.
סוג מבני
| openCypher | Spanner Graph |
|---|---|
| צומת | Node |
| 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 Graph תומך גם בכל הפונקציות והביטויים המובנים של GoogleSQL.
בקטע הזה מפורטות פונקציות וביטויים של openCypher והמקבילים שלהם ב-Spanner Graph.
פונקציות וביטויים מסוג מבני
| סוג | פונקציה או ביטוי של 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()) |
||
toBoolean/toFloat/toInteger |
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 |
||
| String | 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 Graph לא תומך ב-XOR. כותבים את השאילתה באמצעות <>.לדוגמה:
|
||
NOT |
NOT |
||
| String | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
| רשימה | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
ביטויים אחרים
| openCypher | Spanner Graph |
|---|---|
| ביטוי Case | יש תמיכה. |
| שאילתת משנה מסוג EXISTS | יש תמיכה. |
| היטל מפה | לא נתמך. סוגי STRUCT מספקים פונקציות דומות. |
| הבנת הנקרא | לא נתמך.GENERATE_ARRAY ו-ARRAY_TRANSFORM מכסים את רוב תרחישי השימוש. |
פרמטר של שאילתה
השאילתות הבאות מראות את ההבדל בין שימוש בפרמטרים ב-openCypher לבין שימוש בפרמטרים ב-Spanner Graph.
| 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 Graph משתמש ב-GoogleSQL DML כדי לשנות את טבלאות הקלט של הצמתים והקשתות. מידע נוסף זמין במאמר בנושא הוספה, עדכון או מחיקה של נתוני Spanner Graph.
יצירת צומת וקשת
| 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, התוויות מוקצות באופן סטטי בהתאם להצהרת ה-DDL CREATE PROPERTY GRAPH.
עדכון הצומת והקצה
| 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 מסיר את הקצוות המשויכים של צמתים כמו DETACH DELETE ב-openCypher. מידע נוסף מופיע במאמר בנושא סקירה כללית על סכימת 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; |