本文档介绍了如何使用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 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 图查询更新图中的 Account
节点和 Transfer
边:
控制台
在 Google Cloud 控制台中,输入以下包含 DML 语句的 Spanner 图查询,然后点击运行查询:
-- 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。
后续步骤
- 阅读 Spanner 图查询概览。
- 了解调整 Spanner 图查询的最佳实践。