您可以透過 Spanner Graph,將連結的資料建模為屬性圖形,以節點和邊緣網路的形式呈現資訊。節點代表實體,邊緣則顯示實體之間的連結。節點和邊緣包含標籤,可將節點和邊緣分類為集合。節點和邊緣也包含鍵/值組合的屬性。
您可以將輸入資料表的資料列對應至圖形節點和邊緣,藉此定義 Spanner 圖形結構定義。自訂節點和邊緣的標籤和屬性,並瞭解結構定義變更對圖表依附元件的影響。您也可以管理無結構定義資料,以取得更彈性的圖表定義。
如要進一步瞭解 Spanner Graph,請參閱 Spanner Graph 總覽。
瞭解屬性圖資料模型
屬性圖形可讓您建立連結資料的模型。以節點和邊緣的網路表示資訊。節點代表資料環境中的實體,例如顧客、產品或地點。邊緣會顯示節點之間的連結,捕捉關係,例如購買、追蹤或位於。
節點和邊緣都可以包含下列資訊:
- 標籤:將節點和邊緣分類為集合,例如「城市」。
- 屬性 (鍵/值組合),例如「人口數」。
圖 1 中的範例說明如何設計圖表,模擬金融活動。這個圖表包含以下類型的實體 (以節點形式呈現):
- 人員:代表參與金融交易的個人。
- 帳戶:代表用於交易的銀行帳戶。
這些實體會透過不同類型的關係連結,並以以下有向邊表示:
- 擁有:一個人擁有一或多個帳戶。
- 轉帳:將款項從一個帳戶轉移至另一個帳戶。
每個有向邊都表示從來源節點流向目的地節點的單向關係。舉例來說,Transfers
邊緣會將來源 Account
連接至目的地 Account
,表示資金流向。
圖 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
:
Person
和Account
節點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 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
標籤。
將邊緣輸入資料表中的資料列對應至圖形中的邊緣
- 邊緣輸入資料表中的每一列 (元素鍵不得為空值) 通常會對應至圖形中的唯一邊緣。
- 圖表中的一列可能對應到零個或多個邊緣。舉例來說,當來源節點參照與來源節點表格中的零或多個節點相符時,就會發生這種情況。
- 您可以在不同的節點或邊緣定義中使用相同的輸入資料表,建立不同的節點或邊緣集。詳情請參閱「合併節點和邊緣輸入資料表」。
自訂標籤和屬性
您可以使用 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 Graph 不允許下列結構定義變更:
- 您無法捨棄
Account
資料表。如要這麼做,請移除Account
節點定義。詳情請參閱「移除現有節點或邊緣定義」。 - 您無法從
Account
資料表捨棄create_time
資料欄。如要這麼做,請從Account
節點定義中移除create_time
屬性。詳情請參閱「更新現有節點或邊緣定義」。
不過,您可以進行下列結構定義變更:
- 如果其他結構定義規定允許,請修改
Account
資料表和id
與create_time
欄結構定義。詳情請參閱「更新結構定義」。
查看結構定義視覺化圖表
執行 Spanner Graph 查詢後,您可以在 Spanner Studio 中查看結構定義的視覺化呈現。詳情請參閱「使用 Spanner 圖表視覺化功能」。
管理無結構定義資料
Spanner Graph 也支援無結構定義的資料管理,有助於您定義更彈性的圖形。詳情請參閱「在 Spanner 圖表中管理無結構定義資料」。