创建和查询图
本文档介绍了如何使用 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语句
或可视化图建模器。
以下示例使用 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 magic 命令,后跟
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 进行供应链追溯。