本文档介绍了如何使用 Google Cloud 控制台、Google Cloud CLI 和客户端库在 Spanner 图中更改数据。对图数据进行更改包括在 Spanner 图中插入、更新和删除节点和边。
Spanner Graph 会将表中的数据映射到图节点和边。如需在图表中更改数据,您必须更改相应输入表中的数据。有关 请参阅 Spanner 图架构概览。
准备工作
如需完成本文档中的 Google Cloud 控制台步骤和代码示例,您必须先按照使用 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 语句并 点击运行查询:
-- 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 语句,然后点击运行查询:
-- 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 更新节点或边缘
以下示例更新了一个 Account
节点和一条 Transfer
边缘,
使用 Spanner 图 DML 的图查询:
控制台
在 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 语句,然后点击运行查询:
-- 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 图查询与 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
}
用于更改图表数据的选项
您可以通过以下方式自动更改图表数据:
- 使用 删除级联时 操作。
- 使用 TTL 政策自动删除图中的节点和边。如需了解详情,请参阅 节点和边缘的 TTL。
如需高效地批量更新和删除图中的节点和边,请使用分区 DML。