סקירה כללית של שאילתות גרפים
במאמר הזה מוסבר מהי שפת שאילתות גרף (GQL) ואיך לכתוב שאילתות גרף ל-BigQuery Graph. אתם יכולים להריץ שאילתות גרף כדי למצוא דפוסים, לעבור בין קשרים ולקבל תובנות מגרף הנכס. הדוגמאות במסמך הזה מתייחסות לגרף שנקרא FinGraph, שבו מוצגים הקשרים בין אנשים, החשבונות שבבעלותם וההעברות בין החשבונות. מידע על הגדרת הגרף זמין בדוגמה של FinGraph.
מבנה השאילתה
שאילתת גרף מורכבת משם הגרף, שאחריו מופיעות אחת או יותר הצהרות של שאילתות לינאריות. כל שאילתה לינארית מכילה הצהרה אחת או יותר, שמאפשרות לעבוד עם נתוני גרף כדי למצוא התאמות לדפוסים, להגדיר משתנים, לסנן ולשנות נתונים ביניים ולהחזיר תוצאות. מריצים שאילתת גרף באותו אופן שבו מריצים שאילתת SQL ב-BigQuery.
התאמת דפוסים בגרף
התאמת תבניות לתרשים מאפשרת למצוא תבניות ספציפיות בתוך התרשים. הדפוסים הבסיסיים ביותר הם דפוסי רכיבים, כמו דפוסי צמתים שתואמים לצמתים ודפוסי קצוות שתואמים לקצוות.
תבניות של צמתים
תבנית של צומת תואמת לצמתים בתרשים. הדפוס הזה מכיל סוגריים תואמים, שיכולים לכלול משתנה של דפוס גרף, ביטוי של תווית ומסנני מאפיינים.
חיפוש כל הצמתים
השאילתה הבאה מחזירה את כל הצמתים בתרשים. המשתנה n, משתנה של תבנית גרף, נקשר לצמתים התואמים. במקרה כזה, תבנית הצומת תתאים לכל הצמתים בתרשים.
GRAPH graph_db.FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;
השאילתה הזו מחזירה את label ואת id:
label |
id |
|---|---|
Account |
7 |
Account |
16 |
Account |
20 |
Person |
1 |
Person |
2 |
Person |
3 |
חיפוש כל הצמתים עם תווית ספציפית
השאילתה הבאה תואמת לכל הצמתים בתרשים שיש להם Person
תווית.
השאילתה מחזירה את התווית וכמה מאפיינים של הצמתים התואמים.
GRAPH graph_db.FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;
השאילתה הזו מחזירה את המאפיינים הבאים של הצמתים התואמים:
label |
id |
name |
|---|---|---|
Person |
1 |
Alex |
Person |
2 |
Dana |
Person |
3 |
Lee |
מציאת כל הצמתים שתואמים לביטוי של תווית
אפשר ליצור ביטוי תוויות עם אופרטור לוגי אחד או יותר. לדוגמה, השאילתה הבאה תואמת לכל הצמתים בתרשים שיש להם את התווית Person או Account. משתנה תבנית הגרף n חושף את כל המאפיינים מהצמתים עם התווית Person או Account.
GRAPH graph_db.FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
שימו לב לתוצאות של השאילתה הזו:
- לכל הצמתים יש את המאפיין
id. - לצמתים שתואמים לתווית
Accountיש את המאפייןcreate_timeאבל אין להם את המאפייןbirthday. הערך של המאפייןbirthdayהואNULLעבור הצמתים האלה. - לצמתים שתואמים לתווית
Personיש את המאפייןbirthdayאבל אין להם את המאפייןcreate_time. הערך של המאפייןcreate_timeהואNULLעבור הצמתים האלה.
label |
id |
birthday |
create_time |
|---|---|---|---|
Account |
7 |
NULL |
2020-01-10T14:22:20.222Z |
Account |
16 |
NULL |
2020-01-28T01:55:09.206Z |
Account |
20 |
NULL |
2020-02-18T13:44:20.655Z |
Person |
1 |
1991-12-21T08:00:00Z |
NULL |
Person |
2 |
1980-10-31T08:00:00Z |
NULL |
Person |
3 |
1986-12-07T08:00:00Z |
NULL |
חיפוש כל הצמתים שתואמים לביטוי התווית ולמסנן המאפיינים
השאילתה הבאה מתאימה לכל הצמתים בתרשים שיש להם התווית Person והמאפיין id ששווה ל-1:
GRAPH graph_db.FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;
התוצאה אמורה להיראות כך:
label |
id |
name |
birthday |
|---|---|---|---|
Person |
1 |
Alex |
1991-12-21T08:00:00Z |
אפשר להשתמש בסעיף WHERE כדי ליצור תנאי סינון מורכבים יותר על תוויות ומאפיינים.
השאילתה הבאה משתמשת בסעיף WHERE כדי לסנן צמתים שבהם המאפיין birthday קודם ל-1990-01-10:
GRAPH graph_db.FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;
התוצאה אמורה להיראות כך:
label |
name |
birthday |
|---|---|---|
Person |
Dana |
1980-10-31T08:00:00Z |
Person |
Lee |
1986-12-07T08:00:00Z |
דוגמאות עיצוב לקצוות
תבנית קצה מתאימה לקצוות או לקשרים בין צמתים. תבניות קצה מוקפות בסוגריים מרובעים ([]) וכוללות סמלים כמו -, -> או <- כדי לציין כיוונים. תבנית קצה יכולה לכלול משתנה של תבנית גרף כדי לקשר לקצוות תואמים.
חיפוש כל הקצוות עם תוויות תואמות
השאילתה הזו מחזירה את כל הקצוות בתרשים עם התווית Transfers. השאילתה קושרת את משתנה תבנית הגרף e לקצוות התואמים.
GRAPH graph_db.FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number;
התוצאה אמורה להיראות כך:
src_account |
order_number |
|---|---|
7 |
304330008004315 |
7 |
304120005529714 |
16 |
103650009791820 |
20 |
304120005529714 |
20 |
302290001255747 |
חיפוש כל הקשתות שתואמות לביטוי התווית ולמסנן המאפיינים
תבנית הקצה בשאילתה הבאה משתמשת בביטוי של תוויות ובמסנן מאפיינים כדי למצוא את כל הקצוות עם התווית Transfers שתואמים למספר הזמנה שצוין:
GRAPH graph_db.FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number;
התוצאה אמורה להיראות כך:
src_account |
order_number |
|---|---|
7 |
304120005529714 |
20 |
304120005529714 |
מציאת כל הקצוות באמצעות תבנית קצה בכל כיוון
אפשר להשתמש בדפוס הקצה any direction (-[]-) בשאילתה כדי להתאים לקצוות בכל כיוון. השאילתה הבאה מוצאת את כל ההעברות עם חשבון חסום:
GRAPH graph_db.FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;
התוצאה אמורה להיראות כך:
order_number |
amount |
|---|---|
304330008004315 |
300 |
304120005529714 |
100 |
103650009791820 |
300 |
302290001255747 |
200 |
דפוסי נתיבים
תבנית נתיב מורכבת מתבניות של צמתים וקשתות לסירוגין.
חיפוש כל הנתיבים מצומת ספציפית באמצעות תבנית נתיב
השאילתה הבאה מוצאת את כל ההעברות לחשבון שהתחילו מחשבון בבעלות Person עם id ששווה ל-2.
כל תוצאה תואמת מייצגת נתיב מצומת Person כאשר id שווה ל-2 דרך צומת Account מחובר באמצעות קשת Owns, אל צומת Account אחר באמצעות קשת Transfers.
GRAPH graph_db.FinGraph
MATCH
(p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
(to_account:Account)
RETURN
p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;
התוצאה אמורה להיראות כך:
sender_id |
from_id |
to_id |
|---|---|---|
2 |
20 |
7 |
2 |
20 |
16 |
דפוסי נתיבים כמותיים
תבנית כמותית חוזרת על תבנית בטווח שצוין.
התאמה לדוגמת עיצוב של קצה עם ערך כמותי
כדי למצוא נתיבים באורך משתנה, אפשר להחיל כמותן על תבנית קצה. השאילתה הבאה מדגימה את זה על ידי חיפוש חשבונות יעד שנמצאים במרחק של העברה אחת עד שלוש מהמקור Account עם הערך id של 7.
השאילתה מחילה את הכמת {1, 3} על תבנית הקצה -[e:Transfers]->. ההוראה הזו בשאילתה היא להתאים נתיבים שבהם חוזר דפוס הקצה Transfers פעם אחת, פעמיים או שלוש. הסעיף WHERE משמש להחרגת חשבון המקור מהתוצאות. הפונקציה ARRAY_LENGTH משמשת לגישה אל group variable e.
GRAPH graph_db.FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;
התוצאה אמורה להיראות כך:
src_account_id |
path_length |
dst_account_id |
|---|---|---|
7 |
1 |
16 |
7 |
1 |
16 |
7 |
3 |
16 |
7 |
3 |
16 |
7 |
2 |
20 |
7 |
2 |
20 |
חלק מהשורות בתוצאות חוזרות על עצמן. הסיבה לכך היא שיכולות להיות כמה נתיבים שתואמים לתבנית בין אותם צומתי מקור ויעד, והשאילתה מחזירה את כולם.
התאמה של תבנית נתיב כמותית
השאילתה הבאה מוצאת נתיבים בין צמתי Account עם קשתות Transfers אחת או שתיים דרך חשבונות ביניים חסומים.
תבנית הנתיב שבסוגריים עוברת כימות, והסעיף WHERE שלה מציין תנאים לתבנית החוזרת.
GRAPH graph_db.FinGraph
MATCH
(src:Account)
((a:Account)-[:Transfers]->(b:Account {is_blocked:true}) WHERE a != b){1,2}
-[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;
התוצאה אמורה להיראות כך:
src_account_id |
dst_account_id |
|---|---|
7 |
20 |
7 |
20 |
20 |
20 |
משתני קבוצה
משתנה של תבנית גרף שמוצהר בתבנית כמותית הופך למשתנה קבוצה כשניגשים אליו מחוץ לתבנית הזו. לאחר מכן, הוא נקשר למערך של אלמנטים תואמים בתרשים.
אפשר לגשת למשתנה קבוצה כמערך. רכיבי הגרף נשמרים בסדר שבו הם מופיעים לאורך הנתיבים התואמים. אפשר לצבור משתנה קיבוץ באמצעות צבירה אופקית.
משתנה של קבוצת גישה
בדוגמה הבאה, הגישה למשתנה e מתבצעת באופן הבא:
- כמשתנה של דפוס גרף שקשור לקצה יחיד בסעיף
WHEREe.amount > 100כשהוא נמצא בתוך הדפוס הכמותי. - כמשתנה קבוצה שקשור למערך של רכיבי קצה ב-
ARRAY_LENGTH(e)במשפטRETURNכשהוא מחוץ לתבנית הכמותית. - כמשתנה קבוצה שקשור למערך של רכיבי קצה, שמצטבר על ידי
SUM(e.amount)מחוץ לתבנית הכמותית. זו דוגמה לצבירה אופקית.
GRAPH graph_db.FinGraph
MATCH
(src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
(dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
total_amount, dst.id AS dst_account_id;
התוצאה אמורה להיראות כך:
src_account_id |
path_length |
total_amount |
dst_account_id |
|---|---|---|---|
7 |
1 |
300 |
16 |
7 |
2 |
600 |
20 |
קידומות לחיפוש נתיבים
כדי להגביל את הנתיבים התואמים בתוך קבוצות שחולקות צומתי מקור ויעד, אפשר להשתמש בקידומת החיפוש של הנתיב ANY, ANY SHORTEST או ANY CHEAPEST.
אפשר להוסיף את הקידומות האלה רק לפני תבנית של נתיב שלם, ואי אפשר להוסיף אותן בתוך סוגריים.
התאמה באמצעות ANY
השאילתה הבאה מוצאת את כל החשבונות הייחודיים שאפשר להגיע אליהם, שנמצאים במרחק של אחד או שני Transfers צעדים מצומת Account נתונה.
הקידומת ANY של חיפוש הנתיב מבטיחה שהשאילתה תחזיר רק נתיב אחד בין צמד ייחודי של צמתי src ו-dst Account. בדוגמה הבאה, למרות שאפשר להגיע לצומת Account עם {id: 16} בשני נתיבים שונים מצומת המקור Account, השאילתה מחזירה רק נתיב אחד.
GRAPH graph_db.FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY_CONCAT(ARRAY_AGG(e.Id), [dst.Id])
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;
התוצאה אמורה להיראות כך:
src_account_id |
dst_account_id |
ids_in_path |
|---|---|---|
7 |
16 |
7,16 |
7 |
20 |
7,16,20 |
התאמה באמצעות ANY SHORTEST
הקידומת ANY SHORTEST של חיפוש נתיב מחזירה נתיב יחיד לכל זוג של צמתי מקור ויעד, שנבחר מתוך הנתיבים עם המספר המינימלי של קשתות.
לדוגמה, השאילתה הבאה מוצאת את אחת מהנתיבים הקצרים ביותר בין צומת Account עם ערך id של 7 לבין צומת Account עם ערך id של 20. השאילתה מתייחסת לנתיבים עם קצה אחד עד שלושה Transfers.
GRAPH graph_db.FinGraph
MATCH ANY SHORTEST (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account {id: 20})
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ARRAY_LENGTH(e) AS path_length;
התוצאה אמורה להיראות כך:
src_account_id |
dst_account_id |
path_length |
|---|---|---|
7 |
20 |
2 |
התאמה באמצעות ANY CHEAPEST
קידומת החיפוש של הנתיב ANY CHEAPEST מוודאת שכל שאילתה תחזיר רק נתיב אחד עם עלות החישוב הכוללת המינימלית, לכל צמד של חשבונות מקור ויעד.
השאילתה הבאה מוצאת נתיב עם עלות כוללת מינימלית של מחשוב בין צמתי Account. העלות הזו מבוססת על סכום המאפיין amount של קצוות Transfers. החיפוש מתבצע בשבילים עם קצה אחד עד שלושה Transfers
קצוות.
GRAPH graph_db.FinGraph
MATCH ANY CHEAPEST (src:Account)-[e:Transfers COST e.amount]->{1,3}(dst:Account)
LET total_cost = sum(e.amount)
RETURN src.id AS src_account_id, dst.id AS dst_account_id, total_cost;
התוצאה אמורה להיראות כך:
src_account_id |
dst_account_id |
total_cost |
|---|---|---|
7 |
7 |
900 |
7 |
16 |
100 |
7 |
20 |
400 |
16 |
7 |
800 |
16 |
16 |
500 |
16 |
20 |
300 |
20 |
7 |
500 |
20 |
16 |
200 |
20 |
20 |
500 |
דפוסים בגרף
דפוס גרף מורכב מדפוס נתיב אחד או יותר, שמופרדים באמצעות פסיק (,). דפוסי גרף יכולים להכיל פסוקית WHERE, שמאפשרת לכם לגשת לכל המשתנים של דפוס הגרף בדפוסי הנתיב כדי ליצור תנאי סינון. כל תבנית של נתיב יוצרת אוסף של נתיבים.
התאמה באמצעות תבנית גרף
השאילתה הבאה מזהה חשבונות ביניים ואת הבעלים שלהם שהיו מעורבים בעסקאות בסכומים שמעל 200, שדרכן הועברו כספים מחשבון מקור לחשבון חסום.
תבניות הנתיבים הבאות יוצרות את תבנית הגרף:
- התבנית הראשונה מוצאת נתיבים שבהם ההעברה מתבצעת מחשבון אחד לחשבון חסום באמצעות חשבון ביניים.
- התבנית השנייה מוצאת נתיבים מחשבון לאדם שהוא הבעלים שלו.
המשתנה interm משמש כקישור משותף בין שני דפוסי הנתיבים, ולכן interm צריך להפנות לאותו צומת אלמנט בשני דפוסי הנתיבים. הפעולה הזו יוצרת פעולת צירוף שווה על סמך המשתנה interm.
GRAPH graph_db.FinGraph
MATCH
(src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
(interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
src.id AS src_account_id, dst.id AS dst_account_id,
interm.id AS interm_account_id, p.id AS owner_id;
התוצאה אמורה להיראות כך:
src_account_id |
dst_account_id |
interm_account_id |
owner_id |
|---|---|---|---|
20 |
16 |
7 |
1 |
משפטי שאילתה לינאריים
אפשר לשרשר כמה הצהרות גרף כדי ליצור הצהרת שאילתה לינארית. ההצהרות מבוצעות באותו סדר שבו הן מופיעות בשאילתה.
כל הצהרה מקבלת את הפלט מההצהרה הקודמת כקלט. הקלט ריק עבור המשפט הראשון.
הפלט של ההצהרה האחרונה הוא התוצאה הסופית.
לדוגמה, אפשר להשתמש בהצהרות שאילתה לינאריות כדי למצוא את ההעברה המקסימלית לחשבון חסום. השאילתה הבאה מאתרת את החשבון ואת הבעלים שלו עם ההעברה היוצאת הגדולה ביותר לחשבון חסום.
GRAPH graph_db.FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account {is_blocked:true})
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;
הטבלה הבאה ממחישה את התהליך הזה באמצעות הצגת התוצאות הזמניות שמועברות בין כל הצהרה. כדי שהרשימה לא תהיה ארוכה מדי, מוצגים רק חלק מהנכסים.
| דף חשבון | תוצאת ביניים (בקיצור) | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MATCH
(src_account:Account)
-[transfer:Transfers]->
(dst_account:Account {is_blocked:true})
|
|
||||||||||||
ORDER BY transfer.amount DESC |
|
||||||||||||
LIMIT 1 |
|
||||||||||||
MATCH
(src_account:Account)
<-[owns:Owns]-
(owner:Person)
|
|
||||||||||||
RETURN
src_account.id AS account_id,
owner.name AS owner_name
|
|
התוצאה אמורה להיראות כך:
| account_id | owner_name |
|---|---|
7 |
Alex |
פקודת חזרה
המשפט RETURN
מציין מה להחזיר מהדפוסים התואמים. היא יכולה לגשת למשתני תבנית גרף ולכלול ביטויים וסעיפים אחרים, כמו ORDER BY ו-GROUP BY.
BigQuery Graph לא תומך בהחזרת רכיבי גרף כתוצאות של שאילתה. כדי להחזיר את כל רכיב התרשים, משתמשים בפונקציה TO_JSON.
החזרת רכיבי גרף כ-JSON
GRAPH graph_db.FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
התוצאה אמורה להיראות כך:
| n |
|---|
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation
Fund"}} |
כתיבת שאילתות גדולות יותר באמצעות מילת המפתח NEXT
אפשר לשרשר כמה הצהרות של שאילתות לינאריות של גרפים באמצעות מילת המפתח NEXT.
ההצהרה הראשונה מקבלת קלט ריק, והפלט של כל הצהרה עוקבת הופך לקלט של ההצהרה הבאה.
בדוגמה הבאה מוצאים את הבעלים של החשבון עם הכי הרבה העברות נכנסות על ידי שרשור של כמה הצהרות לינאריות של גרף. אפשר להשתמש באותו משתנה, למשל account, כדי להתייחס לאותו רכיב בתרשים בכמה הצהרות לינאריות.
GRAPH graph_db.FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1
NEXT
MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;
התוצאה אמורה להיראות כך:
| account_id | owner_name | num_incoming_transfers |
|---|---|---|
16 |
Lee |
3 |
אפשר גם לשלב הצהרות לינאריות של שאילתות עם אופרטורים של קבוצות.
פונקציות וביטויים
אתם יכולים להשתמש בכל הפונקציות של GoogleSQL (פונקציות מצטברות ופונקציות סקלריות), באופרטורים ובביטויים מותנים בשאילתות גרף. ב-BigQuery Graph יש גם תמיכה בפונקציות GQL ובאופרטורים של GQL שאפשר להשתמש בהם רק בשאילתות גרף.
השאילתה הבאה כוללת שילוב של פונקציות ואופרטורים של GQL ו-SQL בתוך שאילתת גרף:
GRAPH graph_db.FinGraph
MATCH (person:Person)-[o:Owns]->(account:Account)
WHERE person IS SOURCE OF o
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person
NEXT
RETURN
LABELS(person) AS labels,
accounts,
CONCAT(person.city, ", ", person.country) AS location,
TO_JSON(person) AS person
LIMIT 1;
התוצאה אמורה להיראות כך:
| labels | חשבונות | location | אדם |
|---|---|---|---|
Person |
["Vacation Fund"] |
Adelaide, Australia |
{"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}} |
שאילתות משנה
שאילתת משנה היא שאילתה שמוטמעת בתוך שאילתה אחרת. הכללים הבאים חלים על שאילתות משנה בתוך שאילתות גרף:
- שאילתת משנה מוקפת בזוג סוגריים מסולסלים
{}. - שאילתת משנה מתחילה עם פסקה
GRAPHכדי לציין את הגרף בהיקף. הגרף שצוין לא צריך להיות זהה לגרף שבו נעשה שימוש בשאילתה החיצונית. - אי אפשר להצהיר שוב על משתנה של תבנית גרף שהוצהר מחוץ להיקף של שאילתת המשנה, אבל אפשר להתייחס אליו בביטויים או בפונקציות בתוך שאילתת המשנה.
שימוש בשאילתת משנה כדי למצוא את המספר הכולל של העברות מכל חשבון
השאילתה הבאה מדגימה את השימוש בשאילתת המשנה VALUE. שאילתת המשנה מוקפת בסוגריים מסולסלים {} עם הקידומת של מילת המפתח VALUE. השאילתה מחזירה את המספר הכולל של העברות שהתחילו מחשבון.
GRAPH graph_db.FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
GRAPH graph_db.FinGraph
MATCH (a:Account)-[transfer:Transfers]->(:Account)
WHERE a = account
RETURN COUNT(transfer) AS num_transfers
} AS num_transfers;
התוצאה אמורה להיראות כך:
| name | account_id | num_transfers |
|---|---|---|
Alex |
7 |
2 |
Dana |
20 |
2 |
Lee |
16 |
1 |
רשימה של ביטויי שאילתות משנה נתמכים זמינה במאמר בנושא שאילתות משנה של גרפים ב-BigQuery.
פרמטרים של שאילתה
אפשר להריץ שאילתות ב-BigQuery Graph עם פרמטרים. מידע נוסף זמין במאמר בנושא תחביר והרצת שאילתות עם פרמטרים.
השאילתה הבאה תואמת לצמתי Person שיש להם ערך id שתואם לפרמטר שאילתה:
GRAPH graph_db.FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;
הרצת שאילתות על גרפים וטבלאות ביחד
אפשר לשלב בין שאילתות גרף ושאילתות SQL באמצעות האופרטור GRAPH_TABLE.
האופרטור GRAPH_TABLE מקבל שאילתת גרף לינארי ומחזיר את התוצאה שלה בפורמט טבלאי שאפשר לשלב בשאילתת SQL. היכולת הזו מאפשרת להעשיר תוצאות של שאילתות גרף בתוכן שאינו גרף, ולהיפך.
לדוגמה, אפשר ליצור טבלה CreditReports ולהוסיף כמה דוחות אשראי, כמו בדוגמה הבאה:
CREATE TABLE graph_db.CreditReports (
person_id INT64 NOT NULL,
create_time TIMESTAMP NOT NULL,
score INT64 NOT NULL,
PRIMARY KEY (person_id, create_time) NOT ENFORCED
);
INSERT INTO graph_db.CreditReports (person_id, create_time, score)
VALUES
(1,"2020-01-10 06:22:20.222", 700),
(2,"2020-02-10 06:22:20.222", 800),
(3,"2020-03-10 06:22:20.222", 750);
לאחר מכן, תוכלו לזהות אנשים ספציפיים באמצעות התאמת תבניות גרף ב-GRAPH_TABLE ולצרף את תוצאות שאילתת הגרף לטבלה CreditReports כדי לאחזר את דירוג האשראי.
SELECT
gt.person.id,
credit.score AS latest_credit_score
FROM GRAPH_TABLE(
graph_db.FinGraph
MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account {is_blocked:true})
RETURN DISTINCT person
) AS gt
JOIN graph_db.CreditReports AS credit
ON gt.person.id = credit.person_id
ORDER BY credit.create_time;
התוצאה אמורה להיראות כך:
| person_id | latest_credit_score |
|---|---|
1 |
700 |
2 |
800 |
המאמרים הבאים
- איך יוצרים גרף ומריצים עליו שאילתות
- מידע נוסף על עיצוב סכימת גרף
- איך יוצרים תרשימים של תוצאות השאילתות