本文件說明如何使用Google Cloud 控制台、Google Cloud CLI 和用戶端程式庫,在 Spanner 圖表中變更資料。圖表資料的變異包括在 Spanner 圖表中插入、更新及刪除節點和邊。
Spanner Graph 會將資料從表格對應至圖形節點和邊緣。如要變更圖表中的資料,您必須變更對應的輸入表格中的資料。詳情請參閱 Spanner 圖形結構定義總覽。
事前準備
如要完成 Google Cloud 主控台步驟和本文件中的程式碼範例,您必須先按照「設定及查詢 Spanner 圖」中的步驟執行以下操作:
插入節點或邊
如要插入節點或邊緣,請使用控制台 Google Cloud 、Google Cloud CLI 或 Spanner 用戶端程式庫,將資料列插入節點或邊緣資料表。
在 Google Cloud 控制台和 Google Cloud CLI 中,您可以使用 GoogleSQL 資料操縱語言 (DML) 進行插入。在 Spanner 用戶端程式庫中,您可以使用 DML 或 Mutation API。
插入邊緣前,請確認由邊緣連結的來源和目的地節點是否存在。如果在透過邊緣連結的來源或目的地節點不存在時插入邊緣,可能會發生參照完整性違規錯誤。詳情請參閱「缺少來源節點違反 INTERLEAVE IN 關係」和「缺少目的地節點違反外鍵限制」。
以下範例會將 Account
節點和 Transfer
邊插入圖表中:
主控台
在 Google Cloud 主控台中輸入下列 DML 陳述式,然後點選「Run Query」:
-- 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 example-db --instance=test-instance \ --sql="INSERT INTO Account (id, create_time, is_blocked) VALUES (1, CAST('2000-08-10 08:18:48.463959-07:52' AS TIMESTAMP), false)"
gcloud spanner databases execute-sql example-db --instance=test-instance \ --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 example-db --instance=test-instance \ --sql="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)"
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="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)"
用戶端程式庫
Python
Java
Go
C++
更新節點或邊
如要更新現有的節點或邊緣,請使用 Google Cloud 控制台、gcloud CLI 或 Spanner 用戶端程式庫。
您可以使用 GoogleSQL 資料操縱語言 (DML) 陳述式,或搭配 DML 陳述式的 Spanner 圖表查詢,更新現有的節點或邊。在 Spanner 用戶端程式庫中,您也可以使用 Mutation API。
使用 DML 更新節點或邊
以下範例會使用 DML 更新圖表中的 Account
節點和 Transfer
邊緣:
主控台
在 Google Cloud 主控台中輸入下列 DML 陳述式,然後點選「Run Query」:
-- 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 example-db --instance=test-instance \ --sql="UPDATE Account SET is_blocked = false WHERE id = 2"
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2"
用戶端程式庫
Python
Java
Go
C++
使用圖形查詢和 DML 更新節點或邊
以下範例說明如何使用 DML 搭配 Spanner Graph 查詢,更新圖中的 Account
節點和 Transfer
邊:
主控台
在 Google Cloud 主控台中,輸入以下含 DML 陳述式的 Spanner 圖表查詢,然後按一下「Run Query」:
-- 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 example-db --instance=test-instance \ --sql="UPDATE Account SET is_blocked = false"
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2" --sql=" WHERE id IN { GRAPH FinGraph MATCH (a:Account WHERE a.id = 1)-[:Transfers]->{1,2}(b:Account) RETURN b.id }"
用戶端程式庫
Python
Java
Go
C++
刪除節點或邊
如要刪除現有的節點或邊緣,請使用 Google Cloud 控制台、gcloud CLI 或 Spanner 用戶端程式庫。
在 Google Cloud 控制台和 gcloud CLI 中,您可以使用 GoogleSQL 資料操縱語言 (DML) 進行刪除作業。在 Spanner 用戶端程式庫中,您可以使用 DML 或 Mutation API。
刪除節點前,請確認沒有任何邊緣參照該節點。如果存在這些類型的邊,您可能會收到參照完整性違規錯誤。詳情請參閱「孤立的傳出邊違反父項子項關係」和「孤立的傳入邊違反父項子項關係」。
以下範例會從圖表中刪除 Transfer
邊和 Account
節點。
控制台
- 在 Google Cloud 控制台中執行陳述式。
- 在 Google Cloud 主控台中輸入以下 DML 陳述式,然後按一下「Run Query」:
-- 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 example-db --instance=test-instance \ --sql="DELETE FROM AccountTransferAccount WHERE id = 1 AND to_id = 2"
gcloud spanner databases execute-sql example-db --instance=test-instance \ --sql="DELETE FROM Account WHERE id = 2"
用戶端程式庫
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
}
變更圖譜資料的選項
您可以透過下列方式自動變更圖表資料:
- 使用 ON DELETE CASCADE 動作,自動刪除圖中的邊。
- 使用 TTL 政策自動刪除圖表中的節點和邊。詳情請參閱「節點和邊緣的 TTL」。
如要有效地大量更新及刪除圖中的節點和邊,請使用分區 DML。