הפניה ל-Spanner Graph למשתמשי openCypher

במסמך הזה מוצגת השוואה בין 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;
      
תוצאה ריקה. תוצאה ריקה. תוצאה:
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 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 לא נתמך.
צומת וקצה .
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())
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
שרשרת השוואה
a < b < c

‫Spanner Graph לא תומך בשרשרת של השוואות. היא שוות ערך להשוואות שמחוברות באמצעות AND.
לדוגמה:

      a < b AND b < C
      

בוליאני AND AND
OR OR
XOR
‫Spanner Graph לא תומך ב-XOR. כותבים את השאילתה באמצעות <>.

לדוגמה:
      boolean_1 <> boolean_2
      

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

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, התוויות מוקצות באופן סטטי בהתאם להצהרת ה-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;

המאמרים הבאים