סקירה כללית של שאילתות גרפים

במאמר הזה מוסבר מהי שפת שאילתות גרף (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 מתבצעת באופן הבא:

  • כמשתנה של דפוס גרף שקשור לקצה יחיד בסעיף WHERE e.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})
src_account העברה dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account העברה dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account העברה dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account העברה dst_account owns בעלים
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}
RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
        
account_id owner_name
7 Alex

התוצאה אמורה להיראות כך:

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

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