本文档介绍了如何使用Google Cloud 控制台、Google Cloud CLI 和客户端库在 Spanner Graph 中更改数据。更改图表数据包括在 Spanner Graph 中插入、更新和删除节点和边缘。
Spanner Graph 会将表中的数据映射到图表节点和边缘。如需更改图表中的数据,您必须更改相应输入表中的数据。如需了解详情,请参阅 Spanner Graph 架构概览。
准备工作
如需完成本文档中的 Google Cloud 控制台步骤和代码示例,您必须先按照设置和查询 Spanner Graph 中的步骤执行以下操作:
插入节点或边缘
如需插入节点或边缘,请使用 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 Graph 查询,更新现有节点或边缘。在 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
- 使用 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 更新节点或边缘
以下示例将 Spanner Graph 查询与 DML 搭配使用,来更新图表中的 Account
节点和 Transfer
边缘:
控制台
在 Google Cloud 控制台中,输入以下包含 DML 语句的 Spanner Graph 查询,然后点击运行查询:
-- 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 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。