יצירת גרף ושליחת שאילתות לגביו

‫BigQuery Graph מאפשר ליצור מודלים של נתונים יחסיים כצמתים וקצוות, כדי לשלוח שאילתות לגבי קשרים מורכבים באמצעות Graph Query Language‏ (GQL). במדריך הזה תיצרו טבלאות של צמתים וקצוות למערך נתונים פיננסיים, תגדירו גרף מאפיינים ותריצו שאילתות של תבניות גרפים.

התפקידים הנדרשים

כדי לקבל את ההרשאות שנדרשות לעבודה עם תרשימים, בקשו מהאדמין להקצות לכם את התפקיד BigQuery Data Editor (roles/bigquery.dataEditor) ב-IAM במערך הנתונים שבו אתם יוצרים את טבלאות הצמתים, טבלאות הקצוות והתרשים. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לעבודה עם תרשימים. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:

ההרשאות הנדרשות

כדי לעבוד עם תרשימים, צריך את ההרשאות הבאות:

  • יוצרים תרשים: bigquery.propertyGraphs.create
  • הצגת רשימה של תרשימים והמטא-נתונים שלהם: bigquery.propertyGraphs.list
  • אחזור המטא-נתונים וההגדרה של תרשים: bigquery.propertyGraphs.get
  • עדכון המטא-נתונים וההגדרה של תרשים: bigquery.propertyGraphs.update
  • מחיקת תרשים: bigquery.propertyGraphs.delete

יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.

יצירת טבלאות של צמתים וקצוות

הגרפים נוצרים מטבלאות קיימות ב-BigQuery ומאוחסנים במערכי נתונים. כדי לאחסן את הטבלאות והתרשים שאתם יוצרים בדוגמאות הבאות, צרו מערך נתונים. השאילתה הבאה יוצרת מערך נתונים בשם graph_db:

CREATE SCHEMA IF NOT EXISTS graph_db;

הטבלאות הבאות מכילות מידע על אנשים וחשבונות, ועל הקשרים בין כל אחת מהישויות האלה:

  • ‫Person: מידע על אנשים.
  • ‫Account: מידע על חשבונות בנק.
  • ‫PersonOwnAccount: מידע על הבעלים של החשבונות.
  • ‫AccountTransferAccount: מידע על העברות בין חשבונות.

כדי ליצור את הטבלאות האלה, מריצים את הצהרות CREATE TABLE הבאות:

CREATE OR REPLACE TABLE graph_db.Person (
  id               INT64,
  name             STRING,
  birthday         TIMESTAMP,
  country          STRING,
  city             STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.Account (
  id               INT64,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.PersonOwnAccount (
  id               INT64 NOT NULL,
  account_id       INT64 NOT NULL,
  create_time      TIMESTAMP,
  PRIMARY KEY (id, account_id) NOT ENFORCED,
  FOREIGN KEY (id) REFERENCES graph_db.Person(id) NOT ENFORCED,
  FOREIGN KEY (account_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);

CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
  id               INT64 NOT NULL,
  to_id            INT64 NOT NULL,
  amount           FLOAT64,
  create_time      TIMESTAMP NOT NULL,
  order_number     STRING,
  PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
  FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
  FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);

יצירת גרף

כדי ליצור תרשים, אתם יכולים להשתמש בהצהרה CREATE PROPERTY GRAPH או בכלי החזותי ליצירת מודלים של תרשימים. בדוגמה הבאה, משתמשים בהצהרה CREATE PROPERTY GRAPH כדי ליצור גרף בשם FinGraph במערך הנתונים graph_db. הטבלאות Account ו-Person הן טבלאות הצמתים. הטבלאות AccountTransferAccount ו-PersonOwnAccount הן טבלאות קצוות, שמייצגות קשרים בין טבלאות הצמתים.

CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account,
    graph_db.Person
  )
  EDGE TABLES (
    graph_db.PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
      LABEL Owns,
    graph_db.AccountTransferAccount
      SOURCE KEY (id) REFERENCES Account (id)
      DESTINATION KEY (to_id) REFERENCES Account (id)
      LABEL Transfers
  );

הוספת נתונים

כדי לעדכן את הנתונים בתרשים, מעדכנים את הנתונים בטבלאות הצמתים והקצוות. כשיוצרים תרשים, הנתונים לא מועברים או מועתקים. במקום זאת, תרשים פועל כתצוגה לוגית של הנתונים שקיימים בטבלאות הצמתים והקצוות. השאילתות שלכם מחזירות תוצאות על סמך הנתונים שקיימים בטבלאות הצמתים והקצוות בזמן הרצת השאילתה.

השאילתה הבאה מוסיפה נתונים לטבלאות שיצרתם:

INSERT INTO graph_db.Account
  (id, create_time, is_blocked, nick_name)
VALUES
  (7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
  (16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
  (20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");

INSERT INTO graph_db.Person
  (id, name, birthday, country, city)
VALUES
  (1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
  (2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
  (3,"Lee","1986-12-07 00:00:00","India","Kollam");

INSERT INTO graph_db.AccountTransferAccount
  (id, to_id, amount, create_time, order_number)
VALUES
  (7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
  (7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
  (16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
  (20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
  (20,16,200,"2020-10-17 03:59:40.247","302290001255747");

INSERT INTO graph_db.PersonOwnAccount
  (id, account_id, create_time)
VALUES
  (1,7,"2020-01-10 06:22:20.222"),
  (2,20,"2020-01-27 17:55:09.206"),
  (3,16,"2020-02-18 05:44:20.655");

דוגמה לתרשים פיננסי

שליחת שאילתה לתרשים

כדי לשלוח שאילתה לתרשים, מריצים שאילתות שמשתמשות ב-Graph Query Language.

השאילתה הבאה משתמשת בהצהרת MATCH כדי למצוא מידע על האנשים שדנה העבירה להם כסף:

GRAPH graph_db.FinGraph
MATCH
  (person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
  person.name AS owner,
  transfer.amount AS amount,
  person2.name AS transferred_to
ORDER BY person2.name;

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

+-------+--------+----------------+
| owner | amount | transferred_to |
+-------+--------+----------------+
| Dana  | 500.0  | Alex           |
| Dana  | 200.0  | Lee            |
+-------+--------+----------------+

אתם יכולים גם להשתמש בתרשימים כמקור נתונים בניתוח נתונים באמצעות שיחה, שמאפשר לשאול שאלות בשפה טבעית לגבי התרשימים. לדוגמה, אתם יכולים לשאול "למי דנה העבירה כסף וכמה כסף היא העבירה?"

הצגה חזותית של תוצאות שאילתת גרף

כדי להציג את תוצאות השאילתה בגרף ב-notebook, משתמשים בפקודת הקסם %%bigquery --graph ואחריה בשאילתת ה-GQL. השאילתה צריכה להחזיר רכיבי תרשים בפורמט JSON. כדי להציג באופן חזותי את תוצאות השאילתה שהרצתם בקטע הקודם, מריצים את השאילתה הבאה בתא קוד של Notebook:

%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
  p = ((person:Person {name: "Dana"})-[own:Owns]->
  (account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
  TO_JSON(p) AS path;

תרשים של ההעברות של דנה ב-Notebook

מחיקת תרשים

כדי למחוק תרשים, משתמשים בהצהרה DROP PROPERTY GRAPH. מחיקת תרשים לא משפיעה על הטבלאות ששימשו להגדרת הצמתים והקצוות של התרשים. השאילתה הבאה מוחקת את התרשים FinGraph:

DROP PROPERTY GRAPH graph_db.FinGraph;

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