グラフを作成してクエリする

このドキュメントでは、 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;

ノートブックでの Dana の転送の可視化

グラフを削除する

グラフを削除するには、DROP PROPERTY GRAPHステートメントを使用します。グラフを削除しても、グラフのノードとエッジの定義に使用されたテーブルには影響しません。次のクエリは、FinGraph グラフを削除します。

DROP PROPERTY GRAPH graph_db.FinGraph;

次のステップ