本文說明如何在 Spanner 圖表中插入、更新及刪除節點和邊緣,藉此管理資料。Spanner Graph 會將資料從資料表對應至圖形節點和邊緣。如要在圖表中變動資料,必須在對應的輸入資料表中變動資料。您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Spanner 用戶端程式庫管理圖表資料。
設定 Spanner Graph
如要管理 Spanner Graph 中的資料,請先完成下列步驟,設定 Spanner Graph:
這些章節中的範例會使用您在設定 Spanner Graph 時,透過先前步驟建立的執行個體和資料庫。
插入節點或邊緣
如要將節點或邊緣插入節點或邊緣資料表,請使用控制台、gcloud CLI 或 Spanner 用戶端程式庫。 Google Cloud
在 Google Cloud 控制台和 gcloud CLI 中,您可以使用 GoogleSQL 資料操縱語言 (DML)。在 Spanner 用戶端程式庫中,您可以使用 DML 或 Mutation API。
插入邊緣前,請確認邊緣連接的來源和目的地節點存在。如果插入邊緣時,邊緣所連線的來源或目的地節點不存在,您可能會收到參照完整性違規錯誤。詳情請參閱「Missing source node violates INTERLEAVE IN relationship」和「Missing destination node violates foreign key constraint」。
下列範例會將 Account
節點和 Transfer
邊緣插入您在「設定 Spanner 圖表」中建立的資料庫。
主控台
在 Google Cloud 控制台中,執行下列 DML 陳述式。詳情請參閱「在 Google Cloud 控制台中執行陳述式」。
-- Insert 2 Account nodes.
INSERT INTO Account (id, create_time, is_blocked)
VALUES (1, CAST('2000-08-10 08:18:48.463959-07:52' AS TIMESTAMP), false);
INSERT INTO Account (id, create_time, is_blocked)
VALUES (2, CAST('2000-08-12 07:13:16.463959-03:41' AS TIMESTAMP), true);
-- Insert 2 Transfer edges.
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 2, CAST('2000-09-11 03:11:18.463959-06:36' AS TIMESTAMP), 100);
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 1, CAST('2000-09-12 04:09:34.463959-
05:12' AS TIMESTAMP), 200);
gcloud
在 gcloud CLI 中執行下列指令。詳情請參閱「使用 gcloud CLI 執行陳述式」。
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO Account (id, create_time, is_blocked) VALUES (1, CAST('2000-08-10 08:18:48.463959-07:52' AS TIMEST
AMP), false)" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO Account (id, create_time, is_blocked) VALUES (2, CAST('2000-08-12 07:13:16.463959-03
:41' AS TIMESTAMP), true)" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO AccountTransferAccount (id, to_id, create_time, amount) VALUES (1, 2, CAST('2000-09-1
103:11:18.463959-06:36' AS TIMESTAMP), 100)" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="INSERT INTO AccountTransferAccount (id, to_id, create_time, amount) VALUES (1, 1, C
AST('2000-09-12 04:09:34.463959-05:12' AS TIMESTAMP), 200)"
更改下列內容:
- DATABASE_NAME:資料庫名稱。
- INSTANCE_NAME:執行個體名稱。
用戶端程式庫
Python
Java
Go
C++
更新節點或邊緣
如要更新現有節點或邊緣,請使用Google Cloud 控制台、gcloud CLI 或 Spanner 用戶端程式庫。
您可以使用 GoogleSQL 資料操縱語言 (DML) 陳述式,或搭配 DML 陳述式的 Spanner Graph 查詢,更新現有節點或邊緣。如果您使用 Spanner 用戶端程式庫,也可以使用 Mutation API。
使用 DML 更新節點或邊緣
下列範例使用 DML 更新您在「插入節點或邊緣」中新增的 Account
節點和 Transfer
邊緣。
主控台
在 Google Cloud 控制台中,執行下列 DML 陳述式。詳情請參閱「在 Google Cloud 控制台中執行陳述式」。
-- Update Account node
UPDATE Account SET is_blocked = false WHERE id = 2;
-- Update Transfer edge
UPDATE AccountTransferAccount
SET amount = 300
WHERE id = 1 AND to_id = 2;
gcloud
- 使用 gcloud CLI 執行陳述式。
- 在 gcloud CLI 中執行下列指令:
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE Account SET is_blocked = false WHERE id
= 2" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1
AND to_id = 2"
更改下列內容:
- DATABASE_NAME:資料庫名稱。
- INSTANCE_NAME:執行個體名稱。
用戶端程式庫
Python
Java
Go
C++
使用圖形查詢和 DML 更新節點或邊緣
下列範例使用 Spanner 圖形查詢搭配 DML,更新您在「插入節點或邊緣」中新增的 Account
節點和 Transfer
邊緣。
主控台
在 Google Cloud 控制台中,執行下列 DML 陳述式。詳情請參閱「在 Google Cloud 控制台中執行陳述式」。
-- Use Graph pattern matching to identify Account nodes to update:
UPDATE Account SET is_blocked = false
WHERE id IN {
GRAPH FinGraph
MATCH (a:Account WHERE a.id = 1)-[:Transfers]->{1,2}(b:Account)
RETURN b.id
}
gcloud
在 gcloud CLI 中執行下列指令。詳情請參閱「使用 gcloud CLI 執行陳述式」。
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE_NAME \ --sql="UPDATE Account SET is_blocked = f
alse" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2" --sql=" WHERE id IN { GRAPH FinGraph MATCH (a:Account WHER>E a.id = 1)-[:Transfers]-{1,2}(
b:Account) RETURN b.id }"
更改下列內容:
- DATABASE_NAME:資料庫名稱。
- INSTANCE_NAME:執行個體名稱。
用戶端程式庫
Python
Java
Go
C++
刪除節點或邊緣
如要刪除現有節點或邊緣,請使用 Google Cloud 控制台、gcloud CLI 或 Spanner 用戶端程式庫。
在 Google Cloud 控制台和 gcloud CLI 中,您可以使用 GoogleSQL 資料操縱語言 (DML) 刪除資料。在 Spanner 用戶端程式庫中,您可以使用 DML 或 Mutation API 刪除節點或邊緣。
為避免參照完整性違規錯誤,請確保刪除節點時,沒有任何邊緣參照該節點。詳情請參閱「孤立的外向邊緣違反親子關係」和「孤立的內向邊緣違反親子關係」。
下列範例會從圖表中刪除 Transfer
邊緣和 Account
節點。
控制台
在 Google Cloud 控制台中,執行下列 DML 陳述式。詳情請參閱「在 Google Cloud 控制台中執行陳述式」。
-- Delete Transfer edge
DELETE FROM AccountTransferAccount
WHERE id = 1 AND to_id = 2;
-- Delete Account node
DELETE FROM Account WHERE id = 2;
gcloud
在 gcloud CLI 中執行下列指令。詳情請參閱「使用 gcloud CLI 執行陳述式」。
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM AccountTransferAccount WHERE id = 1 AND to_id
= 2" gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM Accoun
t WHERE id = 2"
更改下列內容:
- DATABASE_NAME:資料庫名稱。
- INSTANCE_NAME:執行個體名稱。
用戶端程式庫
Python
Java
Go
C++
您可以將 Spanner Graph 查詢與 DML 陳述式合併,如下列範例所示:
-- Use Graph pattern matching to identify Account nodes to delete:
DELETE FROM AccountTransferAccount
WHERE id IN {
GRAPH FinGraph
MATCH (a:Account WHERE a.id = 1)-[:Transfers]->(b:Account)
RETURN b.id
}
自動化及大量資料作業
除了使用 DML 插入、更新及刪除個別節點和邊緣,您也可以使用下列方法管理 Spanner 圖形資料:
您可以使用 ON DELETE CASCADE 動作,自動刪除圖表中的邊。
您可以使用 TTL 政策,自動刪除圖表中的節點和邊緣。詳情請參閱節點和邊緣的 TTL。
使用分區 DML,有效率地大量更新及刪除圖表中的節點和邊緣。