このドキュメントでは、ノードとエッジの挿入、更新、削除によって Spanner Graph のデータを管理する方法について説明します。Spanner Graph は、テーブルのデータをグラフのノードとエッジにマッピングします。グラフ内のデータを変更するには、対応する入力テーブルのデータを変更する必要があります。 Google Cloud コンソール、Google Cloud CLI、または Spanner クライアント ライブラリを使用して、グラフデータを管理できます。
Spanner Graph を設定する
Spanner Graph でデータを管理する前に、次の操作を行って Spanner Graph を設定する必要があります。
これらのセクションの例では、前の手順で Spanner Graph を設定したときに作成したインスタンスとデータベースを使用します。
ノードまたはエッジを挿入する
ノードテーブルまたはエッジテーブルにノードまたはエッジを挿入するには、 Google Cloud コンソール、gcloud CLI、または Spanner クライアント ライブラリを使用します。
Google Cloud コンソールと gcloud CLI では、GoogleSQL のデータ操作言語(DML)を使用できます。Spanner クライアント ライブラリでは、DML または Mutation API を使用できます。
エッジを挿入する前に、エッジで接続されているソースノードと宛先ノードが存在することを確認します。エッジで接続されているソースノードまたは宛先ノードが存在しないときにエッジを挿入すると、参照整合性違反エラーが発生することがあります。詳細については、ソースノードが存在しないため INTERLEAVE IN 関係に違反すると宛先ノードが存在しないため外部キー制約に違反するをご覧ください。
次の例では、Spanner Graph を設定するで作成したデータベースに Account
ノードと Transfer
エッジを挿入します。
コンソール
Google Cloud コンソールで、次の DML ステートメントを実行します。詳細については、 Google Cloud コンソールでステートメントを実行するをご覧ください。
-- 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 DATABASE-NAME --instance=INSTANCE-NAME \ --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 DATABASE-NAME --instance=INSTANCE-NAME \ --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 DATABASE-NAME --instance=INSTANCE-NAME \ --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 DATABASE-NAME --instance=INSTANCE-NAME \ --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)"
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_NAME: インスタンスの名前。
クライアント ライブラリ
Python
Java
Go
C++
ノードまたはエッジを更新する
既存のノードやエッジを更新するには、Google Cloud コンソール、gcloud CLI、または Spanner クライアント ライブラリを使用します。
既存のノードまたはエッジを更新するには、GoogleSQL のデータ操作言語(DML)ステートメントを使用するか、DML ステートメントで Spanner Graph クエリを使用します。Spanner クライアント ライブラリを使用する場合は、Mutation API を使用することもできます。
DML を使用してノードまたはエッジを更新する
次の例では、DML を使用して、ノードまたはエッジを挿入するで追加した Account
ノードと Transfer
エッジを更新します。
コンソール
Google Cloud コンソールで、次の DML ステートメントを実行します。詳細については、 Google Cloud コンソールでステートメントを実行するをご覧ください。
-- 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 DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE Account SET is_blocked = false WHERE id = 2"
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="UPDATE AccountTransferAccount SET amount = 300 WHERE id = 1 AND to_id = 2"
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_NAME: インスタンスの名前。
クライアント ライブラリ
Python
Java
Go
C++
グラフクエリと DML を使用してノードまたはエッジを更新する
次の例では、DML で Spanner Graph クエリを使用して、ノードまたはエッジを挿入するで追加した Account
ノードと Transfer
エッジを更新します。
コンソール
Google Cloud コンソールで、次の DML ステートメントを実行します。詳細については、 Google Cloud コンソールでステートメントを実行するをご覧ください。
-- 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 DATABASE-NAME --instance=INSTANCE_NAME \ --sql="UPDATE Account SET is_blocked = false"
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --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 }"
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_NAME: インスタンスの名前。
クライアント ライブラリ
Python
Java
Go
C++
ノードまたはエッジを削除する
既存のノードやエッジを削除するには、 Google Cloud コンソール、gcloud CLI、または Spanner クライアント ライブラリを使用します。
Google Cloud コンソールと gcloud CLI では、GoogleSQL のデータ操作言語(DML)を使用して削除します。Spanner クライアント ライブラリでは、DML または Mutation API を使用してノードまたはエッジを削除できます。
参照整合性違反エラーを防ぐため、ノードを削除するときに、そのノードを参照するエッジがないことを確認してください。詳細については、孤立した外向きエッジが親子関係に違反すると孤立した内向きエッジが親子関係に違反するをご覧ください。
次の例では、グラフから Transfer
エッジと Account
ノードを削除します。
コンソール
Google Cloud コンソールで、次の DML ステートメントを実行します。詳細については、 Google Cloud コンソールでステートメントを実行するをご覧ください。
-- 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 DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM AccountTransferAccount WHERE id = 1 AND to_id = 2"
gcloud spanner databases execute-sql DATABASE-NAME --instance=INSTANCE-NAME \ --sql="DELETE FROM Account WHERE id = 2"
次のように置き換えます。
- DATABASE_NAME: データベースの名前。
- INSTANCE_NAME: インスタンスの名前。
クライアント ライブラリ
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
}
自動化された一括データ オペレーション
DML を使用して個々のノードとエッジを挿入、更新、削除するだけでなく、次の方法で Spanner Graph データを管理することもできます。
ON DELETE CASCADE アクションを使用すると、グラフ内のエッジの削除を自動化できます。
TTL ポリシーを使用して、グラフ内のノードとエッジの削除を自動化できます。詳細については、ノードとエッジの TTL をご覧ください。
パーティション化 DML を使用して、グラフ内のノードとエッジを一括で効率的に更新および削除します。