このドキュメントでは、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 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 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
ノードを削除します。
Console
- 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 を使用します。