סקירה כללית של הסכימה
במסמך הזה מוסבר על הרכיבים של סכימת גרף מאפיינים, ומוצגות בו הוראות ליצירה ולניהול של סכימת גרף.
תרשימים מאפשרים ליצור מודל של נתונים מקושרים שמייצגים מידע כרשת של צמתים וקצוות. סכימת גרף מורכבת מצמתים ומקשתות, יחד עם תוויות שמסווגות את הסוג שלהם ומאפיינים שמתארים אותם. אתם מגדירים סכימה של גרף מאפיינים על ידי מיפוי שורות מטבלאות קלט לצמתים ולקשתות של הגרף, והגדרת תוויות ומאפיינים מותאמים אישית. מידע נוסף על BigQuery Graph זמין במאמר סקירה כללית על 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 כדי ליצור גרף מטבלאות. הטבלאות שיוצרות תרשימים נקראות טבלאות קלט.
הגדרת צומת
הצמתים מוגדרים לפי השורות בטבלאות.
כדי להגדיר צומת, מוסיפים הגדרת צומת בNODE TABLES clause.
הצורה הפשוטה ביותר של הגדרת צומת מכילה את השם של טבלת קלט עם מפתח ראשי.
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 ממופה לצומת ייחודי בתרשים שמזוהה על ידי מפתח הרכיב.
- המערכת מתעלמת משורות עם מפתח רכיב null.
אפשר להשתמש באותה טבלת קלט בכמה הגדרות של צמתים. במקרה הזה, שורה נתונה בטבלת הקלט ממופה לצומת אחד לכל הגדרת צומת.
הגדרת קצה
הקצוות מוגדרים על ידי שורות בטבלאות.
כדי להגדיר קצה, מוסיפים הגדרת קצה אל
EDGE TABLES clause.
הצורה הפשוטה ביותר של הגדרת קצה מכילה את השם של טבלת קלט ומגדירה הפניות לצומת המקור והיעד.
ההגדרה הזו משמשת את 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'])
)
);
הצמתים
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כדי לספק תיאור של המאפיין ורשימה של מילים נרדפות. השדות האלה מספקים הקשר ומשפרים את יכולת הגילוי של ממשקי שאילתות בשפה טבעית. אי אפשר לגשת לשדות האלה ישירות בשאילתות הגרף, והם לא משנים את תוצאות השאילתה בשום צורה.
עקביות בין התווית לבין הנכס
בתרשים, התוויות והמאפיינים מזוהים באופן ייחודי לפי השמות שלהם. אפשר להשתמש בתוויות ובמאפיינים עם אותו שם בכמה הגדרות של צמתים או קשתות. עם זאת, תוויות ומאפיינים עם אותו שם צריכים לעמוד בכללים הבאים:
- במאפיינים עם אותו שם צריך להשתמש באותו סוג ערך.
- תוויות עם אותו שם צריכות לחשוף את אותה רשימה של מאפיינים.
בדוגמה הקודמת, התווית 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 באזור של מערך הנתונים שמכיל את התרשים.
אפשר גם להציג את סכימת הגרף במחברת.
עדכון סכימת תרשים
כדי לבצע שינוי בסכימת גרף קיים, צריך להגדיר מחדש את סכימת הגרף באמצעות המשפט 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
- איך יוצרים גרף נכסים ומריצים עליו שאילתות
- איך כותבים שאילתות גרף
- מידע נוסף על יצירת גרפים עם מדדים