グラフを作成してクエリを実行する
このドキュメントでは、BigQuery Graph を使用して財務情報を含むグラフを作成し、Graph Query Language(GQL)を使用してグラフクエリを実行する方法について説明します。
必要なロール
グラフの操作に必要な権限を取得するには、ノードテーブル、エッジテーブル、グラフを作成するデータセットに対する BigQuery データ編集者 (roles/bigquery.dataEditor)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。
この事前定義ロールには、グラフの操作に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
グラフを操作するには、次の権限が必要です。
-
グラフを作成する:
bigquery.propertyGraphs.create -
グラフとそのメタデータを一覧表示します。
bigquery.propertyGraphs.list -
グラフのメタデータと定義を取得します。
bigquery.propertyGraphs.get -
グラフのメタデータと定義を更新します。
bigquery.propertyGraphs.update -
グラフを削除する:
bigquery.propertyGraphs.delete
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
ノードテーブルとエッジテーブルを作成する
グラフは既存の BigQuery テーブルから作成され、データセットに保存されます。次の例で作成するテーブルとグラフを保存するには、データセットを作成します。次のクエリは、graph_db という名前のデータセットを作成します。
CREATE SCHEMA IF NOT EXISTS graph_db;
次の表には、ユーザーとアカウントに関する情報と、これらの各エンティティ間の関係が記載されています。
Person: 人物に関する情報。Account: 銀行口座に関する情報。PersonOwnAccount: どのアカウントを誰が所有しているかに関する情報。AccountTransferAccount: アカウント間の転送に関する情報。
これらのテーブルを作成するには、次の CREATE TABLE ステートメントを実行します。
CREATE OR REPLACE TABLE graph_db.Person (
id INT64,
name STRING,
birthday TIMESTAMP,
country STRING,
city STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.Account (
id INT64,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING,
PRIMARY KEY (id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
PRIMARY KEY (id, account_id) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_db.Person(id) NOT ENFORCED,
FOREIGN KEY (account_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);
CREATE OR REPLACE TABLE graph_db.AccountTransferAccount (
id INT64 NOT NULL,
to_id INT64 NOT NULL,
amount FLOAT64,
create_time TIMESTAMP NOT NULL,
order_number STRING,
PRIMARY KEY (id, to_id, create_time) NOT ENFORCED,
FOREIGN KEY (id) REFERENCES graph_db.Account(id) NOT ENFORCED,
FOREIGN KEY (to_id) REFERENCES graph_db.Account(id) NOT ENFORCED
);
グラフを作成する
グラフを作成するには、CREATE PROPERTY GRAPH ステートメントまたはビジュアル グラフ モデラーを使用します。次の例では、CREATE PROPERTY GRAPH ステートメントを使用して、graph_db データセットに FinGraph というグラフを作成します。Account テーブルと Person テーブルはノードテーブルです。AccountTransferAccount テーブルと PersonOwnAccount テーブルはエッジテーブルで、ノードテーブル間の関係を表します。
CREATE OR REPLACE PROPERTY GRAPH graph_db.FinGraph
NODE TABLES (
graph_db.Account,
graph_db.Person
)
EDGE TABLES (
graph_db.PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
LABEL Owns,
graph_db.AccountTransferAccount
SOURCE KEY (id) REFERENCES Account (id)
DESTINATION KEY (to_id) REFERENCES Account (id)
LABEL Transfers
);
データの挿入
グラフ内のデータを更新するには、ノードテーブルとエッジテーブルのデータを更新します。グラフを作成しても、データは移動またはコピーされません。代わりに、グラフはノードテーブルとエッジテーブルに存在するデータの論理ビューとして機能します。グラフクエリは、クエリの実行時にノードテーブルとエッジテーブルに存在するデータに基づいて結果を返します。
次のクエリは、作成したテーブルにデータを挿入します。
INSERT INTO graph_db.Account
(id, create_time, is_blocked, nick_name)
VALUES
(7,"2020-01-10 06:22:20.222",false,"Vacation Fund"),
(16,"2020-01-27 17:55:09.206",true,"Vacation Fund"),
(20,"2020-02-18 05:44:20.655",false,"Rainy Day Fund");
INSERT INTO graph_db.Person
(id, name, birthday, country, city)
VALUES
(1,"Alex","1991-12-21 00:00:00","Australia","Adelaide"),
(2,"Dana","1980-10-31 00:00:00","Czech_Republic","Moravia"),
(3,"Lee","1986-12-07 00:00:00","India","Kollam");
INSERT INTO graph_db.AccountTransferAccount
(id, to_id, amount, create_time, order_number)
VALUES
(7,16,300,"2020-08-29 15:28:58.647","304330008004315"),
(7,16,100,"2020-10-04 16:55:05.342","304120005529714"),
(16,20,300,"2020-09-25 02:36:14.926","103650009791820"),
(20,7,500,"2020-10-04 16:55:05.342","304120005529714"),
(20,16,200,"2020-10-17 03:59:40.247","302290001255747");
INSERT INTO graph_db.PersonOwnAccount
(id, account_id, create_time)
VALUES
(1,7,"2020-01-10 06:22:20.222"),
(2,20,"2020-01-27 17:55:09.206"),
(3,16,"2020-02-18 05:44:20.655");

グラフをクエリする
グラフをクエリするには、Graph Query Language を使用するクエリを実行します。
次のクエリは、MATCH ステートメントを使用して、Dana が誰に送金したかに関する情報を検索します。
GRAPH graph_db.FinGraph
MATCH
(person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(account2:Account)<-[own2:Owns]-(person2:Person)
RETURN
person.name AS owner,
transfer.amount AS amount,
person2.name AS transferred_to
ORDER BY person2.name;
結果は次のようになります。
+-------+--------+----------------+ | owner | amount | transferred_to | +-------+--------+----------------+ | Dana | 500.0 | Alex | | Dana | 200.0 | Lee | +-------+--------+----------------+
グラフを会話型分析のデータソースとして使用することもできます。これにより、グラフについて自然言語で質問できます。たとえば、「Dana が誰にいくら送金したか?」と質問します。
グラフクエリの結果を可視化する
%%bigquery --graph マジック コマンドの後に GQL クエリを指定して、ノートブックでグラフクエリの結果を可視化できます。クエリは、グラフ要素を JSON 形式で返す必要があります。前のセクションで実行したクエリの結果を可視化するには、ノートブックのコードセルで次のクエリを実行します。
%%bigquery --graph
GRAPH graph_db.FinGraph
MATCH
p = ((person:Person {name: "Dana"})-[own:Owns]->
(account:Account)-[transfer:Transfers]->(acount2:Account)<-[own2:Owns]-(person2:Person))
RETURN
TO_JSON(p) AS path;

グラフを削除する
グラフを削除するには、DROP PROPERTY GRAPH ステートメントを使用します。グラフを削除しても、グラフのノードとエッジの定義に使用されたテーブルには影響しません。次のクエリは、FinGraph グラフを削除します。
DROP PROPERTY GRAPH graph_db.FinGraph;
次のステップ
- BigQuery Graph の概要をご覧ください。
- 詳しくは、グラフ スキーマをご覧ください。
- 詳しくは、グラフクエリを作成する方法をご覧ください。
- Graph Query Language(GQL)の詳細を確認する。
- 不正行為の検出に関するチュートリアルについては、BigQuery Graph を使用した不正行為の検出をご覧ください。
- 顧客プロファイルに関するチュートリアルについては、BigQuery Graph を使用して顧客 360 の推奨事項を構築するをご覧ください。
- サプライ チェーンに関するチュートリアルについては、BigQuery グラフを使用してサプライ チェーンのトレーサビリティを実現するをご覧ください。