יצירת תרשים מתצוגת SQL

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

לפני שמתחילים

כדי ליצור תרשים, צריך:

  1. מוודאים שסביבת Spanner Graph מוגדרת.

  2. מומלץ לקרוא על הסכימות של Spanner Graph.

יצירת תרשים באמצעות תצוגות

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

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

  2. משתמשים בתצוגות בסעיפים NODE TABLES ו-EDGE TABLES של ההצהרה CREATE PROPERTY GRAPH כדי ליצור תרשים.

  3. כוללים את סעיף KEY בהצהרת CREATE PROPERTY GRAPH. הפסקה KEY מציינת את העמודות מתצוגת המקור שמזהות באופן ייחודי כל רכיב בתרשים.

דוגמה: יצירת תרשים באמצעות תצוגות

בדוגמה הזו נוצרות התצוגות הבאות על הטבלאות Customer ו-Account: AsiaCustomer, AsiaBankAccount ו-AsiaAccountsOwnership. לאחר מכן, בדוגמה נעשה שימוש בתצוגות האלה כדי ליצור את התרשים הבא:

  • יוצרים את טבלת הצמתים Customer באמצעות התצוגה AsiaCustomer.

  • יוצרים את טבלת הצמתים Account באמצעות התצוגה AsiaBankAccount.

  • יוצרים את טבלת הקצה Owns באמצעות התצוגה AsiaAccountsOwnership. הקצה הזה מחבר בין צומתי Customer לצומתי Account.

שלב 1: יצירת הטבלאות

קודם יוצרים את טבלאות הנתונים. הקוד הבא יוצר את הטבלאות Customer ו-Account.

CREATE TABLE Customer (
  customer_id INT64 NOT NULL,
  name STRING(MAX),
  address_continent STRING(MAX),
  address_country STRING(MAX),
) PRIMARY KEY(customer_id);

CREATE TABLE Account (
  account_id INT64 NOT NULL,
  customer_id INT64 NOT NULL,
  account_type STRING(MAX),
  balance INT64,
  create_time TIMESTAMP,
  address_continent STRING(MAX),
  address_country STRING(MAX),
  CONSTRAINT FK_CustomerId FOREIGN KEY (customer_id)
    REFERENCES Customer (customer_id)
) PRIMARY KEY(account_id);

שלב 2: יצירת התצוגות

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

-- View for 'Customer' nodes, filtered for Asia
CREATE VIEW AsiaCustomer
  SQL SECURITY INVOKER AS
    SELECT customer.customer_id, customer.name
    FROM Customer customer
    WHERE LOWER(customer.address_continent) = "asia";

-- View for 'Account' nodes, filtered for Asia.
CREATE VIEW AsiaBankAccount
  SQL SECURITY INVOKER AS
    SELECT account.account_id, account.balance, account.account_type, account.create_time
    FROM Account account
    WHERE LOWER(account.address_continent) = "asia";

-- View for 'Owns' edges, connecting customers to accounts in Asia.
CREATE VIEW AsiaAccountsOwnership
  SQL SECURITY INVOKER AS
    SELECT account.customer_id, account.account_id
    FROM Account account
    WHERE LOWER(account.address_continent) = "asia";

שלב 3: יצירת גרף הנכסים

עכשיו יוצרים את AsiaFinGraph באמצעות התצוגות שיצרתם. ההצהרה CREATE PROPERTY GRAPH כוללת את הסעיף KEY לכל הגדרה של רכיב בתרשים, כדי לציין עמודות שמזהות באופן ייחודי את הרכיבים בתרשים.

CREATE PROPERTY GRAPH AsiaFinGraph
  NODE TABLES (
    AsiaCustomer AS Customer KEY(customer_id),
    AsiaBankAccount AS Account KEY(account_id)
  )
  EDGE TABLES (
    AsiaAccountsOwnership AS Owns
      KEY(customer_id, account_id)
      SOURCE KEY (customer_id) REFERENCES Customer (customer_id)
      DESTINATION KEY (account_id) REFERENCES Account (account_id)
  );

דוגמאות לתרחישי שימוש

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

דוגמה: אכיפה של בקרת גישה לנתונים פרטנית של תרשים

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

לדוגמה, כדי להגביל את הגישה לתרשים רק לעובדים במרכז עלויות הנדסי, אפשר ליצור תצוגה EngineerEmployeeView ולהעניק הרשאות SELECT לתצוגה לתפקיד engineering_data_reader באמצעות פסקה GRANT.

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

-- The table containing all employee data.
CREATE TABLE Employee (
  id INT64 NOT NULL,
  cost_center STRING(MAX),
  job_title STRING(MAX),
  office STRING(MAX)
) PRIMARY KEY (id);

-- The definer's rights view that filters for engineering employees.
CREATE VIEW EngineerEmployeeView SQL SECURITY DEFINER AS
  SELECT e.id, e.cost_center, e.job_title, e.office
  FROM Employee e
  WHERE LOWER(e.cost_center) = "engineering";

-- The role that is granted to read the view.
CREATE ROLE engineering_data_reader;
GRANT SELECT ON VIEW EngineerEmployeeView TO ROLE engineering_data_reader;

-- The graph that uses definer's rights view.
CREATE PROPERTY GRAPH EngineeringGraph
  NODE TABLES (
    EngineerEmployeeView KEY(id)
  );

דוגמה: רכיבי תרשים שנגזרים ממודל

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

לדוגמה, אפשר UNNEST נתונים מעמודה מסוג ARRAY (או משדה מערך בתוך עמודה מסוג JSON) כדי ליצור מודל של כמה קשרים בין קצוות משורה אחת.

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

-- Parts table with an ARRAY of dependent parts.
CREATE TABLE Parts (
  part_id INT64 NOT NULL,
  dependent_parts ARRAY<INT64>
) PRIMARY KEY (part_id);

-- A view that unnests the dependent_parts array.
-- GROUP BY ensures uniqueness for the graph element KEY.
CREATE VIEW PartDependsOnPart SQL SECURITY INVOKER AS
  SELECT p.part_id, dependent_part_id
  FROM Parts AS p,
    UNNEST(p.dependent_parts) AS dependent_part_id
  GROUP BY p.part_id, dependent_part_id;

-- Graph modeling the part dependency relationship.
CREATE PROPERTY GRAPH SupplyChainGraph
  NODE TABLES (
    Parts
  )
  EDGE TABLES (
    PartDependsOnPart KEY (part_id, dependent_part_id)
      SOURCE KEY (part_id) REFERENCES Parts(part_id)
      DESTINATION KEY (dependent_part_id) REFERENCES Parts(part_id)
  );

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

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

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

  1. מגדירים תצוגה לכל סוג של צומת וקשת שרוצים להגדיר באופן רשמי (לדוגמה, Person או WorksFor). בתצוגה, מסננים את הנתונים לפי התווית שלהם (לדוגמה, WHERE n_label = "person") ומבצעים המרה של המאפיינים מהעמודה של JSON לסוגי נתונים ספציפיים (לדוגמה, STRING(prop.name) AS name).

  2. מגדירים גרף מאפיינים חדש שבו NODE TABLES ו-EDGE TABLES מפנים לתצוגות המוקלדות שיצרתם.

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

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

  1. מגדירים את הטבלאות הקנוניות GraphNode ו-GraphEdge עבור המודל ללא סכימה.

  2. ליצור תרשים ראשוני וגמיש על הטבלאות האלה ללא סכימה.

  3. הגדרת תצוגות מוקלדות (Person, Company, WorksFor) שמחלצות את הנתונים מהטבלאות ללא סכימה ומעבירות אותם לפורמט רשמי.

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

-- 1. Create the canonical tables for a schemaless model.
CREATE TABLE GraphNode (
  id INT64 NOT NULL,
  label STRING(MAX) NOT NULL,
  properties JSON
) PRIMARY KEY (id);

CREATE TABLE GraphEdge (
  id INT64 NOT NULL,
  dest_id INT64 NOT NULL,
  edge_id INT64 NOT NULL,
  label STRING(MAX) NOT NULL,
  properties JSON
) PRIMARY KEY (id, dest_id, edge_id),
  INTERLEAVE IN PARENT GraphNode;

-- 2. Define a schemaless graph.
CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    GraphNode
      DYNAMIC LABEL (label)
      DYNAMIC PROPERTIES (properties)
  )
  EDGE TABLES (
    GraphEdge
      SOURCE KEY (id) REFERENCES GraphNode(id)
      DESTINATION KEY (dest_id) REFERENCES GraphNode(id)
      DYNAMIC LABEL (label)
      DYNAMIC PROPERTIES (properties)
  );

-- 3. Define typed views that extract and formalize the data.
--    Convert JSON fields to primitive types (for example, INT64, STRING) to
--    ensure type safety.
CREATE VIEW Person SQL SECURITY INVOKER AS
  SELECT n.id, STRING(n.properties.name) AS name, INT64(n.properties.age) AS age
  FROM GraphNode n WHERE n.label = "person";

CREATE VIEW Company SQL SECURITY INVOKER AS
  SELECT n.id, STRING(n.properties.name) AS company_name, BOOL(n.properties.is_public) AS is_public
  FROM GraphNode n WHERE n.label = "company";

CREATE VIEW WorksFor SQL SECURITY INVOKER AS
  SELECT e.id AS person_id, e.dest_id AS company_id, e.edge_id AS edge_id, STRING(e.properties.since) AS since
  FROM GraphEdge e
  WHERE e.label = "worksfor";

-- 4. Create the final, formalized graph from the typed views.
CREATE PROPERTY GRAPH typed_formalized_graph
  NODE TABLES (
    Person KEY(id)
      PROPERTIES (name, age),
    Company KEY(id)
      PROPERTIES (company_name, is_public)
  )
  EDGE TABLES(
    WorksFor KEY(person_id, company_id, edge_id)
      SOURCE KEY (person_id) REFERENCES Person(id)
      DESTINATION KEY (company_id) REFERENCES Company(id)
      PROPERTIES (since)
  );

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