יצירה של גרף והרצת שאילתה עליו

במאמר הזה מוסבר איך להשתמש ב-BigQuery Graph כדי ליצור גרף עם מידע פיננסי ולהריץ שאילתות גרף באמצעות Graph Query Language (GQL).

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

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

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

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

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

  • יצירת תרשים: 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            |
+-------+--------+----------------+

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

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

אפשר להציג את תוצאות השאילתה של הגרף במחברת באמצעות פקודת ה-magic ‏%%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;

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