グラフを作成してクエリする
このドキュメントでは、 BigQuery Graph を使用して財務情報を含む グラフを作成し、 Graph Query Language(GQL)を使用して グラフクエリを実行する方法について説明します。
必要なロール
グラフの作成とクエリに必要な権限を取得するには、ノードテーブル、エッジテーブル、グラフを作成するデータセットに対するBigQuery データ編集者 (roles/bigquery.dataEditor)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織に対するアクセス権の管理をご覧ください。
必要な権限は、カスタム ロールや他の事前定義 ロールから取得することもできます。
ノードテーブルとエッジテーブルを作成する
グラフは既存の 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 ステートメントを使用します。
次の例では、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 を使用するクエリを実行します。
次のクエリでは、a
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 | +-------+--------+----------------+
グラフクエリの結果を可視化する
ノートブックでグラフクエリの結果を可視化するには、%%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 Graph を使用したサプライ チェーンのトレーサビリティをご覧ください。