סקירה כללית של הסכימה
במאמר הזה מוסבר מהם הרכיבים של סכימת תרשים, ואיך ליצור ולנהל סכימת תרשים.
תרשימים מאפשרים ליצור מודלים של נתונים מקושרים שמייצגים מידע כרשת של צמתים וקצוות. סכימת גרף מורכבת מצמתים וקצוות, לצד תוויות שמסווגות את הסוג שלהם ומאפיינים שמתארים אותם. כדי להגדיר סכימת תרשים, ממפים שורות מטבלאות קלט לצמתים ולקצוות של התרשים, ומגדירים תוויות ומאפיינים בהתאמה אישית. סקירה כללית על BigQuery Graph
הסבר על מודל הנתונים של הגרף
תרשים מאפשר ליצור מודל של נתונים מחוברים כרשת של צמתים וקצוות. צמתים מייצגים ישויות בנתונים, כמו לקוחות, מוצרים או מיקומים. הקשתות מייצגות את הקשרים בין הצמתים האלה, ומתעדות קשרים כמו רכישות, מעקבים או מיקומים.
הצמתים והקצוות יכולים לכלול את המידע הבא:
תוויות: סיווג של סוגי הצמתים והקצוות. לדוגמה, לתלמידים בכיתה יכולות להיות התוויות
Studentו-Person. אם לא מגדירים במפורש תווית לצומת או לקשת, BigQuery Graph משתמש בשם של טבלת הקלט כתווית ברירת המחדל.מאפיינים: משמשים לתיאור צמתים וקצוות. לדוגמה, לצומת שמייצג אדם יכול להיות מאפיין
nameעם הערךAlexומאפייןidעם הערך1.
הדוגמה באיור 1 מראה איך אפשר לעצב תרשים כדי ליצור מודל של פעילויות פיננסיות. התרשים הזה כולל את סוגי הישויות הבאים, שמיוצגים כצמתים:
- אדם: מייצג אדם שמעורב בעסקאות פיננסיות.
- חשבון: מייצג חשבון בנק שמשמש לביצוע עסקאות.
הישויות האלה מקושרות באמצעות סוגים שונים של קשרים, שמיוצגים על ידי הקצוות המכוונים הבאים:
- בעלים: אדם שבבעלותו חשבון אחד או יותר.
- העברות: כסף עובר מחשבון אחד לאחר.
כל קשת מכוונת מציינת קשר חד-כיווני שזורם מצומת מקור לצומת יעד. לדוגמה, קשת Transfers מחברת בין צומת מקור Account לצומת יעד Account, ומציינת את תנועת הכסף.

איור 1. תרשים לדוגמה עם כמה צמתים וקצוות מכוונים.
צמתים וקצוות כוללים מידע נוסף במאפיינים.
צומתי
Personכוללים את המאפיינים הבאים:name(STRING)id(INT64)
הקצוות של
Transfersכוללים את המאפיין הזה:amount(FLOAT64)
קצוות מכוונים ולא מכוונים
קצוות מכוונים מציינים כיוון ספציפי בקשר בין ישויות. לדוגמה, אדם הוא הבעלים של חשבון, אבל חשבון הוא לא הבעלים של אדם. עם זאת, קשרים מסוימים, כמו קשר חברות ברשת חברתית, הם לא מכוונים ומייצגים קשר הדדי. במקרה כזה, אפשר ליצור מודל של קשתות לא מכוונות כשתי קשתות מכוונות, קשת אחת לכל כיוון.
עיצוב הסכימה
ב-BigQuery Graph אפשר להשתמש בהצהרה CREATE PROPERTY GRAPH כדי ליצור תרשים מטבלאות. הטבלאות שיוצרות תרשימים נקראות טבלאות קלט.
הגדרת צומת
הצמתים מוגדרים לפי שורות בסוגים הבאים של טבלאות או תצוגות:
- טבלאות רגילות
- טבלאות חיצוניות
- טבלאות מנוהלות של Apache Iceberg
- טבלאות של קטלוג REST של Lakehouse Iceberg
- תצוגות, כולל תצוגות מורשות
- תצוגות מהותיות לא מצטברות
כדי להגדיר צומת, מוסיפים הגדרת צומת בסעיף NODE TABLES.
הצורה הפשוטה ביותר של הגדרת צומת מכילה את השם של טבלת קלט עם מפתח ראשי.
BigQuery Graph ממפה שורות מטבלת הקלט לצומתי תרשים.
בדוגמה הבאה, משתמשים בסעיף NODE TABLES כדי להגדיר את הצומת Account בתרשים FinGraph. הגדרת הצומת מכילה את טבלת הקלט Account.
-- Create an Account table.
CREATE TABLE graph_db.Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id) NOT ENFORCED
);
-- Use the Account table as the input table for the Account node definition.
CREATE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Account
);
כברירת מחדל, BigQuery משתמש בשם הטבלה כתווית וחושף את כל העמודות מטבלת הקלט כמאפיינים.
- כל צומת של חשבון משתמש בתווית
Account. - כל צומת של חשבון כולל את המאפיינים
idו-create_timeמהעמודות בטבלהAccount.
מפתח הרכיב
הגדרת צומת מגדירה גם את מפתח הרכיב, אוסף של עמודות שמזהה באופן ייחודי צומת בתרשים. כברירת מחדל, מפתח הרכיב הוא המפתח הראשי של טבלת הקלט.
לחלופין, אתם יכולים להשתמש בסעיף KEY כדי להגדיר במפורש מפתחות של רכיבים.
בדוגמה הבאה מוגדרים צומת Account וצומת Person. הצומת Account משתמש במפתח הראשי של הטבלה Account כמפתח הרכיב שלו.
הצומת Person מציין במפורש את העמודה id כמפתח הרכיב באמצעות הסעיף KEY.
CREATE TABLE graph_db.Person (
id INT64 NOT NULL,
name STRING
);
CREATE TABLE graph_db.Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Person KEY (id),
graph_db.Account
);
- כל שורה עם מפתח רכיב שאינו null ממפה לצומת ייחודי בתרשים שמזוהה על ידי מפתח הרכיב.
- המערכת מתעלמת משורות עם מפתח רכיב ריק.
אפשר להשתמש באותה טבלת קלט בכמה הגדרות של צמתים. במקרה כזה, שורה נתונה בטבלת הקלט ממופה לצומת אחד לכל הגדרת צומת.
הגדרת קצה
הקצוות מוגדרים לפי שורות בסוגי הטבלאות או התצוגות הבאים:
- טבלאות רגילות
- טבלאות חיצוניות
- טבלאות מנוהלות של Apache Iceberg
- טבלאות של קטלוג REST של Lakehouse Iceberg
- תצוגות, כולל תצוגות מורשות
- תצוגות מהותיות לא מצטברות
כדי להגדיר קצה, מוסיפים הגדרת קצה לסעיף EDGE TABLES.
הצורה הפשוטה ביותר של הגדרת קשת מכילה את השם של טבלת קלט ומגדירה הפניות לצומת מקור ולצומת יעד.
BigQuery Graph משתמש בהגדרה הזו כדי למפות שורות מטבלת הקלט לקצוות של תרשים.
כברירת מחדל, BigQuery משתמש בשם הטבלה כתווית וחושף את כל העמודות מטבלת הקלט כמאפיינים.
- מפתח הרכיב של כל קשת מוגדר באותו אופן כמו צמתים.
הפניות לצומת המקור ולצומת היעד
הגדרת קצה מגדירה את ההפניה לצומת המקור והיעד באמצעות הסעיפים SOURCE KEY, DESTINATION KEY ו-REFERENCES.
צריך להגדיר את צומתי המקור והיעד לפני שמשתמשים בהם בהגדרת הקשת.
בדוגמה הבאה, יוצרים תרשים בשם FinGraph עם הרכיבים הבאים:
-
Personו-Accountצמתים - הקצה ה
PersonOwnAccount
CREATE TABLE graph_db.Person (
id INT64 NOT NULL,
name STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE TABLE graph_db.Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE TABLE graph_db.PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES graph_db.Account (id) NOT ENFORCED,
PRIMARY KEY (id, account_id) NOT ENFORCED
);
CREATE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Person,
graph_db.Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
כל קצה PersonOwnAccount מחבר צומת Person (מקור) לצומת Account (יעד).
- צומת המקור של קצה הוא צומת
Personשבו המאפייןidזהה למאפייןidשל הקצה. - צומת היעד של קשת הוא צומת
Accountשבו המאפייןidזהה למאפייןaccount_idשל הקשת. - מפתח הרכיב הוא המפתח הראשי של הטבלה
PersonOwnAccount, כלומר(id, account_id). - לכל קצה יש את אותה קבוצת מאפיינים כמו לעמודות מהטבלה
PersonOwnAccount. - לכל קצה יש את התווית
PersonOwnAccountשמוגדרת כברירת מחדל.
מיפוי שורות לקצוות
כל שורה בטבלת הקלט של הצלעות עם מפתח רכיב שאינו null בדרך כלל ממופה לצלע אחת בתרשים. עם זאת, אם ההפניה לצומת המקור או היעד תואמת לאפס צמתים או יותר בטבלת צומת המקור או היעד, השורה בטבלת הקלט של הקשתות יכולה לגרום לאפס קשתות או לכמה קשתות בתרשים.
הגדרת צמתים וקצוות בטבלה אחת
אפשר להגדיר צומת ואת הקצוות הנכנסים או היוצאים שלו בטבלה אחת, אם העמודות בטבלה מגדירות קשר לטבלה אחרת. הגישה הזו מצמצמת את מספר הטבלאות, מפשטת את ניהול הנתונים ויכולה לשפר את ביצועי השאילתות כי היא מבטלת את הצורך בצירוף לטבלת קצוות נפרדת.
לדוגמה, אם בטבלה Account הבאה יש מפתח ראשי מורכב (owner_id, account_id), העמודה owner_id יכולה להיות מפתח זר שמפנה לטבלה Person. המבנה הזה מאפשר לטבלה Account לייצג גם את הצומת Account וגם את הקצה הנכנס מהצומת Person.
CREATE TABLE graph_db.Person (
id INT64 NOT NULL,
PRIMARY KEY (id) NOT ENFORCED
);
-- Assume each account has exactly one owner.
CREATE TABLE graph_db.Account (
owner_id INT64 NOT NULL,
account_id INT64 NOT NULL,
FOREIGN KEY (owner_id) REFERENCES graph_db.Person(id) NOT ENFORCED,
PRIMARY KEY (owner_id, account_id) NOT ENFORCED
);
אפשר להשתמש בטבלה Account כדי להגדיר גם את הצומת Account וגם את הקשת הנכנסת Owns. כמו שמוצג בהצהרת CREATE PROPERTY GRAPH הבאה. בסעיף EDGE TABLES, נותנים לטבלה Account את הכינוי Owns. הסיבה לכך היא שלכל רכיב בסכימת התרשים חייב להיות שם ייחודי.
CREATE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Person,
graph_db.Account
)
EDGE TABLES (
graph_db.Account AS Owns
SOURCE KEY (owner_id) REFERENCES Person
DESTINATION KEY (owner_id, account_id) REFERENCES Account
);
התאמה אישית של תוויות ומאפיינים
אפשר להשתמש בסעיפים LABEL ו-PROPERTIES כדי להתאים אישית תוויות ומאפיינים.
בדוגמה הבאה מוגדר צומת Person עם מאפיין מותאם אישית וצומת Account עם כמה תוויות:
CREATE TABLE graph_db.Person (
id INT64 NOT NULL,
name STRING,
birthday TIMESTAMP,
country STRING,
city STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE TABLE graph_db.Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
graph_db.Account KEY (id)
DEFAULT LABEL OPTIONS(description = 'A checking or savings account')
PROPERTIES (id, create_time)
LABEL Entity
PROPERTIES (
id,
nick_name AS name OPTIONS(description = 'A user-defined account name',
synonyms = ['friendly name', 'display name'],
extensions = [('data_classification', 'user'), ('currency', 'USD')])
)
);
הצמתים של
Personמשתמשים בתוויתCustomerכדי לחשוף את המאפייןaddress. המאפייןaddressמוגדר על ידי הביטויCONCAT(city, ", ", country),שמתייחס לעמודותcityו-countryמטבלת הקלטPerson.הצומת
Accountמשתמש בתוויתAccountכדי לחשוף את המאפייניםidו-create_time.
לצמתים Person ו-Account יש את התווית Entity עם המאפיינים id ו-name.
- בצומת
Person, המאפייניםidו-nameמגיעים מעמודות טבלת הקלט. - בצומת
Account, המאפייןnameמתייחס לעמודהnick_nameבטבלת הקלט. - בצומת
Account, המאפייןnameמשתמש בסעיףOPTIONSכדי לספק תיאור של המאפיין, רשימה של מילים נרדפות ורשימה של צמדי מפתח/ערך של מטא-נתונים.
הגדרת אפשרויות
אפשר לציין מטא-נתונים בהתאמה אישית שמוגדרים על ידי המשתמש בסעיף OPTIONS() של הגדרת תווית או מאפיין, כולל הגדרת מדד. אלה האפשרויות שנתמכות:
-
description: תיאור של התווית או המאפיין, שכתוב בצורה שקריאה לאנשים. -
synonyms: מערך של מחרוזות שמייצגות מילים נרדפות לתווית או למאפיין. -
extensions: מערך של זוגות מחרוזות (ARRAY<STRUCT<STRING, STRING>>) שמייצג מטא-נתונים נוספים. אתם יכולים להשתמש בתוספים כדי לספק מטא-נתונים, יחידות או כללי עיצוב בהתאמה אישית, כמו[('currency', 'USD')].
האפשרויות האלה מספקות הקשר ומשפרות את יכולת הגילוי של ממשקי שאילתות בשפה טבעית. אי אפשר לגשת לשדות האלה ישירות בשאילתות של התרשים, והם לא משנים את תוצאות השאילתות של GQL בשום צורה.
עקביות בתוויות ובמאפיינים
בגרף, תוויות ומאפיינים מזוהים באופן ייחודי לפי השמות שלהם. אפשר להשתמש בתוויות ובמאפיינים עם אותו שם בכמה הגדרות של צמתים או קשתות. עם זאת, תוויות ומאפיינים עם אותו שם חייבים לעמוד בכללים הבאים:
- מאפיינים עם אותו שם חייבים להשתמש באותו סוג ערך.
- תוויות עם אותו שם חייבות לחשוף את אותה רשימת מאפיינים.
בדוגמה הקודמת, התווית Entity מוגדרת גם בצומת Person וגם בצומת Account. שתי ההגדרות כוללות את אותה קבוצה של שמות מאפיינים, id ו-name, עם סוגי ערכים זהים.
ניהול יחסי התלות של הסכימה
התרשימים תלויים בסכימה של טבלאות הקלט להגדרות של הצמתים והקצוות, ובעמודות הטבלה שאליהן מפנים המאפיינים. ב-BigQuery Graph לא מתבצעת בדיקה אם מחיקה או שינוי של טבלאות או עמודות מבטלים את התוקף של סכימת גרף קיימת.
אתם אחראים להימנע משינויים בסכימה שעלולים לגרום לתקלות. כדאי לפעול לפי השיטות המומלצות הבאות:
- לפני שמוחקים טבלה שמשמשת להגדרת צומת בתרשים, צריך להסיר את הגדרת הצומת מהתרשים.
- לפני שאתם מסירים עמודה מטבלה שחשופה כמאפיין בתרשים, הסירו את המאפיין מההגדרה של הצומת או הקצה המתאימים.
הצגת סכימות של תרשימים
כדי לראות את הצהרת ה-CREATE PROPERTY GRAPH ששימשה ליצירת גרף קיים, שולחים שאילתה לתצוגה INFORMATION_SCHEMA.PROPERTY_GRAPHS:
SELECT
property_graph_name,
ddl
FROM
`region-REGION`.INFORMATION_SCHEMA.PROPERTY_GRAPHS;
מחליפים את REGION באזור של קבוצת הנתונים שמכילה את התרשים.
אפשר גם להציג את סכימת התרשים ב-notebook.
עדכון סכימת תרשים
כדי לשנות סכימה של גרף קיים, צריך להגדיר מחדש את סכימת הגרף באמצעות ההצהרה CREATE PROPERTY GRAPH.
מחיקת סכימת גרף
כדי למחוק תרשים, משתמשים בהצהרה DROP PROPERTY GRAPH.
שיטות מומלצות
בקטעים הבאים מתוארות שיטות מומלצות להגדרת סכימת הגרף כדי לשפר את הביצועים של שאילתות הגרף.
הגדרת ההיקף של הגדרות הנכס
מאפיינים הם צמדי מפתח/ערך שמספקים מידע נוסף שמצורף לצמתים או לקצוות. מומלץ לכלול רק את המאפיינים הנחוצים בצמתים או בקצוות, ולהימנע משימוש בתחביר PROPERTIES ALL COLUMNS או בתחביר ברירת המחדל שמצרף את כל העמודות מטבלאות הצמתים או הקצוות לרשימת המאפיינים. אם יש הרבה מאפיינים בצמתים או בקצוות, יכול להיות שיתבצעו סריקות עמודות מיותרות בשאילתות של תרשימים, מה שיפגע בביצועים.
כדי להגביל את המאפיינים שאתם כוללים בהגדרה של צומת או קצה, השתמשו במילת המפתח PROPERTIES כשאתם מגדירים מאפייני רכיבים בהצהרת CREATE PROPERTY GRAPH.
ההגדרה הבאה של טבלת הצמתים מגבילה את המאפיינים של טבלת הצמתים Person ל-id ול-name:
NODE TABLES (
graph_db.Person PROPERTIES (id, name)
)
הגדרת אילוצים של מפתחות ראשיים וזרים בצמתים ובקצוות של תרשימים
כדי לבצע אופטימיזציה של שאילתות הגרף, ב-BigQuery אפשר להשתמש באילוצים של מפתחות ראשיים ומפתחות זרים בטבלאות הצמתים והקצוות, וכך לצמצם סריקות מיותרות של טבלאות. עם זאת, BigQuery לא אוכף אילוצים של מפתחות ראשיים או זרים בטבלאות. אם האפליקציה לא יכולה להבטיח שלמות של קשרי גומלין או ייחודיות במפתחות ראשיים, שימוש במפתחות ראשיים או מפתחות זרים לאופטימיזציה של שאילתות עלול להוביל לתוצאות שגויות של שאילתות.
בדוגמה הבאה מוגדרים אילוצים של מפתחות ראשיים ומפתחות זרים בטבלאות הצמתים Person ו-Account, ובטבלת הקצוות PersonOwnAccount:
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
);
המאמרים הבאים
- מידע נוסף על BigQuery Graph
- איך יוצרים גרף ושולחים אליו שאילתות
- איך כותבים שאילתות של תרשימים
- מידע נוסף על יצירת תרשימים עם מדדים