סקירה כללית של סכימת Spanner Graph

‫Spanner Graph מאפשר לכם ליצור מודל של נתונים מקושרים כתרשים מאפיינים שמייצג מידע כרשת של צמתים וקשתות. הצמתים מסמלים ישויות, והקצוות מראים את הקשרים ביניהם. הצמתים והקצוות כוללים תוויות שמסווגות את סוגי הצמתים והקצוות. צמתים וקשתות כוללים גם מאפיינים שמתארים אותם.

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

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

הסבר על מודל הנתונים של גרף הנכסים

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

המידע הבא יכול להיכלל גם בצמתים וגם בקשתות:

  • תוויות: סיווג של צמתים וסוגי קצוות. אם לא מגדירים תווית באופן מפורש לצומת או לקשת, Spanner Graph משתמש בשם טבלת הקלט כתווית ברירת המחדל. לדוגמה, Account יכולה להיות תווית.

  • מאפיינים: משמשים לתיאור צמתים וקשתות. לדוגמה, לצומת Person יכול להיות מאפיין name עם הערך Alex ומאפיין id עם הערך 1.

בדוגמה שבתמונה 1 אפשר לראות איך אפשר לעצב גרף כדי ליצור מודל של פעילויות פיננסיות. התרשים הזה כולל את סוגי הישויות הבאים שמיוצגים כצמתים:

  • אדם: מייצג אדם פרטי שמעורב בעסקאות פיננסיות.
  • חשבון: מייצג חשבון בנק שמשמש לעסקאות.

הישויות האלה מקושרות באמצעות סוגים שונים של קשרים, שמיוצגים על ידי הקשתות המכוונות הבאות:

  • בעלים: אדם שהוא הבעלים של חשבון אחד או יותר.
  • העברות: העברת כסף מחשבון אחד לחשבון אחר.

כל קשת מכוונת מציינת קשר חד-כיווני שמתחיל בצומת מקור ומסתיים בצומת יעד. לדוגמה, קו Transfers מחבר בין מקור Account ליעד Account ומציין את תנועת הכסף.

תרשים סקירה כללית של סכימת Spanner Graph.

איור 1. גרף לדוגמה עם כמה צמתים וקשתות מכוונות.

הצמתים והקשתות כוללים מידע נוסף במאפיינים.

  • צמתי Person כוללים את המאפיינים הבאים:
    • name (STRING)
    • id (INT64)
  • קצוות ההעברות כוללים את המאפיין הזה:
    • amount (FLOAT64)

קשתות מכוונות וקשתות לא מכוונות

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

עיצוב סכימה של Spanner Graph

ב-Spanner Graph, משתמשים בהצהרה CREATE PROPERTY GRAPH כדי ליצור גרף מטבלאות או מתצוגות SQL. הטבלאות שמשמשות ליצירת גרפים נקראות טבלאות קלט. במסמך הזה מוסבר איך להשתמש בטבלאות כדי ליצור תרשים. מידע על שימוש בתצוגות SQL זמין במאמר יצירת Spanner Graph מתצוגת SQL.

הגדרת צומת מטבלה

כדי להגדיר צומת, מוסיפים הגדרת צומת לסעיף NODE TABLES. הצורה הפשוטה ביותר של הגדרת צומת מכילה את השם של טבלת קלט שהוגדרו בה הפניות לצומת המקור ולצומת היעד. ‫Spanner Graph ממפה שורות מטבלת הקלט לצמתי גרף.

בדוגמה הבאה, משתמשים בסעיף NODE TABLES כדי להגדיר את הצומת Account בגרף המאפיינים FinGraph. הגדרת הצומת מכילה את טבלת הקלט Account.

-- First, create an Account table.
CREATE TABLE Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
) PRIMARY KEY (id);

-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account
  );

תוויות ומאפיינים שמוגדרים כברירת מחדל

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

בדוגמה הקודמת,

  • כל צומת בחשבון משתמש בתווית Account.
  • כל צומת בחשבון כולל מאפיינים מתוך העמודות בטבלה [id, create_time].Account

מפתח הרכיב

הגדרת צומת מגדירה גם את מפתח הרכיב שמזהה באופן ייחודי צומת בגרף.

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

בדוגמה הבאה מוגדרים צומת Account וצומת Person.

  • צומת Account משתמש במפתח הראשי של טבלת Account כמפתח הרכיב שלו כברירת מחדל.
  • לעומת זאת, בצומת Person מצוין במפורש id כמפתח האלמנט באמצעות פסוקית KEY.
CREATE TABLE Person (
  id           INT64 NOT NULL,
  name         STRING(MAX),
) PRIMARY KEY (id);

CREATE TABLE Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
) PRIMARY KEY (id);

CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id),
    Account
  );

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

  • כל שורה עם מפתח רכיב שאינו null ממופה לצומת ייחודי בתרשים, שמזוהה על ידי מפתח הרכיב.
  • המערכת מתעלמת משורות עם מפתח רכיב null.

הגדרת קצה מטבלה

כדי להגדיר קצה, מוסיפים הגדרת קצה לפסקה EDGE TABLES. הצורה הפשוטה ביותר של הגדרת קצה מכילה רק שם של טבלת קלט. ‫Spanner Graph ממפה שורות מטבלת הקלט לקצוות הגרף.

הפניות לצומתי המקור והיעד

בדוגמה הבאה, יוצרים גרף נכסים FinGraph עם:

  • Person ו-Account צמתים
  • קצה PersonOwnAccount
CREATE TABLE Person (
  id            INT64 NOT NULL,
  name          STRING(MAX),
) PRIMARY KEY (id);

CREATE TABLE Account (
  id            INT64 NOT NULL,
  create_time   TIMESTAMP,
) PRIMARY KEY (id);

CREATE TABLE PersonOwnAccount (
  id            INT64 NOT NULL,
  account_id    INT64 NOT NULL,
  create_time   TIMESTAMP,
  FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
  INTERLEAVE IN PARENT Person;

CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person,
    Account
  )
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
  );

הגדרת קצה מגדירה את ההפניה לצומת המקור והיעד באמצעות הסעיפים SOURCE KEY, DESTINATION KEY ו-REFERENCES. בדוגמה הבאה נעשה שימוש בהגדרת הקצה של PersonOwnAccount כדי להמחיש את הרעיון הזה:

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:

  • מפתח הרכיב הוא המפתח הראשי של הטבלה PersonOwnAccount, כלומר (id, account_id).
  • לכל קצה יש את אותה קבוצה של מאפיינים כמו העמודות מהטבלה PersonOwnAccount.
  • לכל קצה יש את התווית PersonOwnAccount כברירת מחדל.

מיפוי שורה בטבלת קלט של קשתות לקשתות בתרשים

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

הגדרת צמתים וקשתות בטבלה אחת

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

לדוגמה, אם לטבלה Account הבאה יש מפתח ראשי מורכב (owner_id, account_id), החלק owner_id יכול להיות מפתח זר שמפנה לטבלה Person. המבנה הזה מאפשר לטבלה Account לייצג גם את הצומת Account וגם את הקשת הנכנסת מהצומת Person.

  CREATE TABLE Person (
    id INT64 NOT NULL,
  ) PRIMARY KEY (id);

  -- Assume each account has exactly one owner.
  CREATE TABLE Account (
    owner_id INT64 NOT NULL,
    account_id INT64 NOT NULL,
    FOREIGN KEY (owner_id) REFERENCES Person(id)
  ) PRIMARY KEY (owner_id, account_id);

אפשר להשתמש בטבלה Account כדי להגדיר גם את הצומת Account וגם את הקצה Owns הנכנס שלו. אפשר לראות את זה בהצהרה הבאה CREATE PROPERTY GRAPH. בסעיף EDGE TABLES, נותנים לטבלה Account את הכינוי Owns. הסיבה לכך היא שלכל אלמנט בסכימת הגרף צריך להיות שם ייחודי.

  CREATE PROPERTY GRAPH FinGraph
    NODE TABLES (
      Person,
      Account
    )
    EDGE TABLES (
      Account AS Owns
        SOURCE KEY (owner_id) REFERENCES Person
        DESTINATION KEY (owner_id, account_id) REFERENCES Account
    );

התאמה אישית של תוויות ומאפיינים

אפשר להשתמש בסעיפים LABEL ו-PROPERTIES כדי להתאים אישית תוויות ומאפיינים.

בדוגמה הבאה מוגדרים שני צמתים: Person ו-Account.

  • צמתי Person משתמשים בתווית Customer כדי לחשוף את המאפיין address. המאפיין address מוגדר על ידי הביטוי CONCAT(city, ", ", country), שמתייחס לעמודות city ו-country מטבלת הקלט Person.
  • ב-Account, הצומת Account משתמש בתווית Account כדי לחשוף את המאפיינים id ו-create_time.
  • ל-Person ול-Account יש את התווית Entity עם המאפיינים [id, name].
    • במקרה של Person, המאפיינים id ו-name מגיעים מעמודות בטבלת הקלט.
    • במקרה של Account, הנכס name מתייחס לעמודה nick_name של טבלת הקלט.
CREATE TABLE Person (
  id               INT64 NOT NULL,
  name             STRING(MAX),
  birthday         TIMESTAMP,
  country          STRING(MAX),
  city             STRING(MAX),
) PRIMARY KEY (id);

CREATE TABLE Account (
  id               INT64 NOT NULL,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING(MAX),
) PRIMARY KEY (id);

CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id)
      LABEL Customer
        PROPERTIES (CONCAT(city, ", ", country) AS address)
      LABEL Entity PROPERTIES (id, name),
    Account KEY (id)
      LABEL Account PROPERTIES (id, create_time)
      LABEL Entity PROPERTIES (id, nick_name AS name)
  );

עקביות בין התווית לבין המאפיין

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

  • מאפיינים עם אותו שם משתמשים באותו סוג ערך.
  • תוויות עם אותו שם חושפות את אותה רשימה של מאפיינים.

בדוגמה הקודמת, התווית Entity מוגדרת בצמתים Person ו-Account. שתי ההגדרות כוללות את אותו סט של שמות מאפיינים [id,‏ name] עם סוגי ערכים זהים.

תלויות בין גרפים לבין אובייקטים אחרים בסכימה

הגרף שנוצר על ידי CREATE PROPERTY GRAPH תלוי באובייקטים אחרים של סכימה, כמו טבלאות הקלט של הגדרות הצומת והקצה, ועמודות הטבלה שאליהן מתייחסים המאפיינים. ‫Spanner Graph לא מאפשר שינוי בסכימה שגורם לניתוק של אחד מיחסי התלות האלה.

ההצהרה הבאה גורמת לכך ש-FinGraph יהיה תלוי בטבלה Account ובעמודות id ו-create_time.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account PROPERTIES (id, create_time)
  );

בדוגמה הזו, Spanner Graph לא מאפשר את השינויים הבאים בסכימה:

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

  • אפשר לשנות את הסכימה של הטבלה Account והעמודות id ו-create_time אם דרישות אחרות של הסכימה מאפשרות זאת. מידע נוסף זמין במאמר בנושא ביצוע עדכונים בסכימה.

הצגת המחשה חזותית של סכימה

אחרי שמריצים שאילתת Spanner Graph, אפשר לראות ב-Spanner Studio תרשים של הסכימה. מידע נוסף מופיע במאמר בנושא שימוש בהדמיות של גרפים ב-Spanner.

ניהול נתונים ללא סכימה

בנוסף, Spanner Graph תומך בניהול נתונים ללא סכימה, וזה שימושי כשצריך הגדרת גרף גמישה יותר. מידע נוסף זמין במאמר בנושא ניהול נתונים ללא סכימה ב-Spanner Graph.

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