Spanner Graph 結構定義總覽

您可以透過 Spanner Graph,將連結的資料建模為屬性圖形,以節點和邊緣網路的形式呈現資訊。節點代表實體,邊緣則顯示實體之間的連結。節點和邊緣包含標籤,可將節點和邊緣分類為集合。節點和邊緣也包含鍵/值組合的屬性。

您可以將輸入資料表的資料列對應至圖形節點和邊緣,藉此定義 Spanner 圖形結構定義。自訂節點和邊緣的標籤和屬性,並瞭解結構定義變更對圖表依附元件的影響。您也可以管理無結構定義資料,以取得更彈性的圖表定義。

如要進一步瞭解 Spanner Graph,請參閱 Spanner Graph 總覽

瞭解屬性圖資料模型

屬性圖形可讓您建立連結資料的模型。以節點和邊緣的網路表示資訊。節點代表資料環境中的實體,例如顧客、產品或地點。邊緣會顯示節點之間的連結,捕捉關係,例如購買、追蹤或位於。

節點和邊緣都可以包含下列資訊:

  • 標籤:將節點和邊緣分類為集合,例如「城市」
  • 屬性 (鍵/值組合),例如「人口數」

圖 1 中的範例說明如何設計圖表,模擬金融活動。這個圖表包含以下類型的實體 (以節點形式呈現):

  • 人員:代表參與金融交易的個人。
  • 帳戶:代表用於交易的銀行帳戶。

這些實體會透過不同類型的關係連結,並以以下有向邊表示:

  • 擁有:一個人擁有一或多個帳戶。
  • 轉帳:將款項從一個帳戶轉移至另一個帳戶。

每個有向邊都表示從來源節點流向目的地節點的單向關係。舉例來說,Transfers 邊緣會將來源 Account 連接至目的地 Account,表示資金流向。

Spanner Graph 結構定義總覽圖。

圖 1. 包含多個節點和有向邊的圖表範例。

節點和邊緣包含屬性中的其他資訊。每個屬性都包含名稱和值。

  • 「Person」節點包含下列屬性:
    • name (STRING)
    • id (INT64)
  • Transfers 邊緣包含這項屬性:
    • amount (FLOAT64)

有向和無向邊

範例圖形使用有向邊緣,表示實體之間關係的特定方向。不過,有些關係 (例如社群網路中的「好友」關係) 是無向的,代表互惠連線,沒有明確的來源或端點。在這種情況下,您可以將無向邊緣建模為兩個有向邊緣,每個方向各一個邊緣。

Spanner Graph 結構定義設計

您可以使用 Spanner Graph 的 CREATE PROPERTY GRAPH 陳述式,從資料表建立圖形。建立圖表的資料表稱為「輸入資料表」。這種做法會使用 SQL/PGQ (屬性圖形查詢),這是 SQL:2023 標準的一部分。

在屬性圖中定義節點

如要定義節點,請在 NODE TABLES 子句中新增節點定義。最簡單的節點定義只包含輸入資料表名稱。 Spanner Graph 會將輸入資料表中的資料列對應至圖形節點。

在下列範例中,您會使用 NODE TABLES 子句,在 FinGraph 屬性圖中定義 Account 節點。節點定義包含輸入資料表 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 圖形會將輸入資料表中的所有資料欄公開為節點屬性。

在先前的範例中,

  • 每個帳戶節點都會使用 Account 標籤。
  • 每個帳戶節點都包含來自 Account 資料表資料欄的 [id, create_time] 屬性。

元素鍵

節點定義也會定義元素鍵,用來專門識別圖表節點。

  • 根據預設,元素鍵是輸入資料表的主鍵。
  • 您可以使用 KEY 子句明確定義元素鍵。
  • 您可以使用具有唯一索引限制的資料欄做為元素鍵。

以下範例定義 Account 節點和 Person 節點。

  • 根據預設,Account 節點會使用 Account 資料表的主鍵做為元素鍵。
  • 另一方面,Person 節點會使用 KEY 子句,明確指定 id 做為元素鍵。
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
  );

將輸入資料表中的資料列對應至圖形中的節點

  • 每個含有非空值元素鍵的資料列,都會對應至圖形中的唯一節點,並由元素鍵識別。
  • 系統會忽略元素鍵為空值的資料列。

在屬性圖中定義邊緣

如要定義邊緣,請將邊緣定義新增至 EDGE TABLES 子句。最簡單的邊緣定義只包含輸入資料表名稱。 Spanner Graph 會將輸入資料表中的資料列對應至圖形邊緣。

來源和目的地節點參照

在下列範例中,您會建立具有下列項目的屬性圖 FinGraph

  • PersonAccount 節點
  • PersonOwnAccount edge
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 KEYDESTINATION KEYREFERENCES 子句,定義來源和目的地節點參照。下列範例使用 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 標籤。

將邊緣輸入資料表中的資料列對應至圖形中的邊緣

  • 邊緣輸入資料表中的每一列 (元素鍵不得為空值) 通常會對應至圖形中的唯一邊緣。
  • 圖表中的一列可能對應到零個或多個邊緣。舉例來說,當來源節點參照與來源節點表格中的零或多個節點相符時,就會發生這種情況。
  • 您可以在不同的節點或邊緣定義中使用相同的輸入資料表,建立不同的節點或邊緣集。詳情請參閱「合併節點和邊緣輸入資料表」。

自訂標籤和屬性

您可以使用 LABELPROPERTIES 子句自訂標籤和屬性。

以下範例定義了兩個節點:PersonAccount

  • Person 節點會使用 Customer 標籤公開 address 屬性。address 屬性是由參照輸入資料表 Personcitycountry 資料欄的運算式 CONCAT(city, ", ", country), 定義。
  • 對於 AccountAccount 節點會使用 Account 標籤公開 idcreate_time 屬性。
  • PersonAccount 具有 Entity 標籤,且屬性為 [id, name]。
    • 對於 Personidname 屬性來自輸入資料表欄。
    • 對於 Accountname 屬性是指輸入資料表的 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)
  );

標籤和屬性一致性

在圖表中,標籤和屬性會以名稱做為專屬 ID。您可以在多個節點或邊緣定義中使用同名的標籤和屬性。不過,名稱相同的標籤和屬性必須遵守下列規則:

  • 名稱相同的屬性會使用相同的值類型。
  • 名稱相同的標籤會公開相同的屬性清單。

在前例中,PersonAccount 節點都定義了 Entity 標籤。兩個定義都包含相同的屬性名稱集 [idname],且值類型相同。

圖表和其他結構定義物件之間的依附元件

CREATE PROPERTY GRAPH 建立的圖形取決於其他結構定義物件,例如節點和邊緣定義的輸入資料表,以及屬性參照的資料表資料欄。Spanner Graph 不允許會中斷其中一個依附元件的結構定義變更。

以下陳述式會讓 FinGraph 依附於 Account 資料表,以及 idcreate_time 資料欄。

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

在本例中,Spanner Graph 不允許下列結構定義變更:

  • 您無法捨棄 Account 資料表。如要這麼做,請移除 Account 節點定義。詳情請參閱「移除現有節點或邊緣定義」。
  • 您無法從 Account 資料表捨棄 create_time 資料欄。如要這麼做,請從 Account 節點定義中移除 create_time 屬性。詳情請參閱「更新現有節點或邊緣定義」。

不過,您可以進行下列結構定義變更:

  • 如果其他結構定義規定允許,請修改 Account 資料表和 idcreate_time 欄結構定義。詳情請參閱「更新結構定義」。

查看結構定義視覺化圖表

執行 Spanner Graph 查詢後,您可以在 Spanner Studio 中查看結構定義的視覺化呈現。詳情請參閱「使用 Spanner 圖表視覺化功能」。

管理無結構定義資料

Spanner Graph 也支援無結構定義的資料管理,有助於您定義更彈性的圖形。詳情請參閱「在 Spanner 圖表中管理無結構定義資料」。

後續步驟