创建和查询图表

本文档将向您展示如何使用 BigQuery Graph 创建包含财务信息的图,以及如何使用 Graph Query Language (GQL) 运行图查询。

所需的角色

如需获得创建和查询图所需的权限,请让管理员向您授予您在其中创建节点表、边表和图的数据集的 BigQuery Data Editor (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 的图。AccountPerson 表是节点表。AccountTransferAccountPersonOwnAccount 表是边表,用于表示节点表之间的关系。

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            |
+-------+--------+----------------+

直观呈现图查询结果

您可以在笔记本中使用 %%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;

后续步骤