您可以透過 Spanner Graph,將連結的資料建模為屬性圖形,以節點和邊緣網路的形式呈現資訊。節點代表實體,邊緣則顯示實體之間的連結。節點和邊緣包含可分類節點和邊緣類型的標籤。節點和邊線也包含描述這些節點和邊線的屬性。
您可以將輸入資料表中的資料列對應至圖形節點和邊緣,藉此定義 Spanner 圖形結構定義。自訂節點和邊緣的標籤和屬性,並瞭解結構定義變更對圖表依附元件的影響。您也可以管理無結構定義資料,以取得更彈性的圖表定義。
如要進一步瞭解 Spanner Graph,請參閱 Spanner Graph 總覽。
瞭解屬性圖資料模型
屬性圖表可讓您建立連結資料的模型。以節點和邊緣網路的形式呈現資訊。節點代表資料環境中的實體,例如顧客、產品或地點。邊緣會顯示節點之間的連結,捕捉關係,例如購買、追蹤或位於。
節點和邊緣都可以包含下列資訊:
標籤:分類節點和邊緣類型。如果您未明確定義節點或邊緣的標籤,Spanner Graph 會使用輸入資料表名稱做為預設標籤。舉例來說,
Account可以是標籤。屬性:用於描述節點和邊緣。舉例來說,
Person節點可能具有name屬性,值為Alex,以及id屬性,值為1。
圖 1 中的範例說明如何設計圖表,模擬金融活動。這個圖表包含下列類型的實體 (以節點形式呈現):
- 人員:代表參與金融交易的個人。
- 帳戶:代表用於交易的銀行帳戶。
這些實體會透過不同類型的關係連結,並以以下有向邊表示:
- 擁有:一個人擁有一或多個帳戶。
- 轉帳:將款項從一個帳戶轉移至另一個帳戶。
每個有向邊都表示從來源節點到目的地節點的單向關係。舉例來說,Transfers 邊緣會將來源 Account 連接至目的地 Account,表示資金流向。
圖 1. 包含多個節點和有向邊的圖表範例。
節點和邊緣會在屬性中包含其他資訊。
- 「Person」節點包含下列屬性:
name(STRING)id(INT64)
- 轉移邊緣包含這項屬性:
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:
Person和Account節點PersonOwnAccountedge
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標籤。
將邊緣輸入資料表中的資料列對應至圖形中的邊緣
- 邊緣輸入資料表中的每一列 (元素鍵不得為空值) 通常會對應至圖形中的唯一邊緣。
- 資料列可能對應到圖表中的零個或多個邊緣。舉例來說,當來源節點參照與來源節點表格中的零或多個節點相符時,就會發生這種情況。
在單一資料表中定義節點和邊緣
如果資料表的資料欄定義與其他資料表的關係,您可以在單一資料表中定義節點及其傳入或傳出的邊。這種做法可減少資料表數量、簡化資料管理,並消除聯結至個別邊緣資料表的需求,進而提升查詢效能。
舉例來說,如果下列 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屬性是由參照輸入資料表Person中city和country資料欄的運算式CONCAT(city, ", ", country),定義。- 對於
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)
);
標籤和屬性一致性
在圖表中,標籤和屬性會以名稱做為專屬 ID。您可以在多個節點或邊緣定義中使用同名的標籤和屬性。不過,名稱相同的標籤和屬性必須遵守下列規則:
- 名稱相同的屬性會使用相同的值類型。
- 名稱相同的標籤會公開相同的屬性清單。
在前例中,Person 和 Account 節點都定義了 Entity 標籤。兩個定義都包含相同的屬性名稱集 [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 圖表不允許下列結構定義變更:
- 您無法捨棄
Account資料表。如要這麼做,請移除Account節點定義。詳情請參閱「移除現有節點或邊緣定義」。 - 您無法從
Account資料表捨棄create_time資料欄。如要這麼做,請從Account節點定義中移除create_time屬性。詳情請參閱「更新現有節點或邊緣定義」。
不過,您可以進行下列結構定義變更:
- 如果其他結構定義需求允許,請修改
Account資料表和id與create_time欄結構定義。詳情請參閱「更新結構定義」。
查看結構定義視覺化圖表
執行 Spanner Graph 查詢後,您可以在 Spanner Studio 中查看結構定義的視覺化呈現。詳情請參閱「使用 Spanner Graph 視覺化功能」。
管理無結構定義資料
Spanner Graph 也支援無結構定義的資料管理,有助於您定義更彈性的圖形。詳情請參閱「在 Spanner 圖表中管理無結構定義資料」。