图表查询概览
本文简要介绍了图查询语言 (GQL) 以及如何为 BigQuery Graph 编写图查询。您可以运行图查询,以查找模式、遍历关系并从属性图中获取数据洞见。本文档中的示例引用了一个名为 FinGraph 的图,该图显示了人、他们拥有的账号以及账号之间的转账关系。如需了解图表的定义,请参阅 FinGraph 示例。
查询结构
图表查询由图表的名称以及一个或多个线性查询语句组成。每个线性查询都包含一个或多个语句,这些语句可让您处理图数据,以查找模式匹配项、定义变量、过滤和转换中间数据,以及返回结果。您可以通过与在 BigQuery 中运行 SQL 查询相同的方式运行图查询。
图表模式匹配
图表模式匹配可在图表中查找特定模式。最基本的模式是元素模式,例如匹配节点的节点模式和匹配边的边模式。
节点模式
节点模式用于匹配图表中的节点。此模式包含一对匹配的圆括号,其中可选择包含图形模式变量、标签表达式和属性过滤器。
查找所有节点
以下查询会返回图表中的所有节点。变量 n(称为图表模式变量)会绑定到匹配节点。在这种情况下,节点模式会匹配图表中的所有节点。
GRAPH graph_db.FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;
此查询会返回 label 和 id:
label |
id |
|---|---|
Account |
7 |
Account |
16 |
Account |
20 |
Person |
1 |
Person |
2 |
Person |
3 |
查找具有特定标签的所有节点
以下查询会匹配图中具有 Person
标签的所有节点。该查询会返回匹配节点的标签和一些属性。
GRAPH graph_db.FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;
此查询会返回匹配节点的以下属性:
label |
id |
name |
|---|---|---|
Person |
1 |
Alex |
Person |
2 |
Dana |
Person |
3 |
Lee |
查找与标签表达式匹配的所有节点
您可以创建包含一个或多个逻辑运算符的标签表达式。 例如,以下查询会匹配图表中具有 Person 或 Account 标签的所有节点。图表模式变量 n 公开具有 Person 或 Account 标签的节点的所有属性。
GRAPH graph_db.FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;
请注意此查询结果中的以下内容:
- 所有节点都具有
id属性。 - 与
Account标签匹配的节点具有create_time属性,但不具有birthday属性。对于这些节点,birthday属性为NULL。 - 与
Person标签匹配的节点具有birthday属性,但不具有create_time属性。对于这些节点,create_time属性为NULL。
label |
id |
birthday |
create_time |
|---|---|---|---|
Account |
7 |
NULL |
2020-01-10T14:22:20.222Z |
Account |
16 |
NULL |
2020-01-28T01:55:09.206Z |
Account |
20 |
NULL |
2020-02-18T13:44:20.655Z |
Person |
1 |
1991-12-21T08:00:00Z |
NULL |
Person |
2 |
1980-10-31T08:00:00Z |
NULL |
Person |
3 |
1986-12-07T08:00:00Z |
NULL |
查找与标签表达式和属性过滤条件匹配的所有节点
以下查询会匹配图表中具有 Person 标签且属性 id 等于 1 的所有节点:
GRAPH graph_db.FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;
结果类似于以下内容:
label |
id |
name |
birthday |
|---|---|---|---|
Person |
1 |
Alex |
1991-12-21T08:00:00Z |
您可以使用 WHERE 子句对标签和属性构造更复杂的过滤条件。
以下查询使用 WHERE 子句过滤属性 birthday 在 1990-01-10 之前的节点:
GRAPH graph_db.FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;
结果类似于以下内容:
label |
name |
birthday |
|---|---|---|
Person |
Dana |
1980-10-31T08:00:00Z |
Person |
Lee |
1986-12-07T08:00:00Z |
边缘模式
边缘模式用于匹配节点之间的边缘或关系。边模式用方括号 ([]) 括起来,并包含 -、-> 或 <- 等符号来表示方向。边模式可以选择性地包含图表模式变量,以绑定到匹配的边。
查找具有匹配标签的所有边缘
此查询会返回图中具有 Transfers 标签的所有边。查询会将图表模式变量 e 绑定到匹配的边。
GRAPH graph_db.FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number;
结果类似于以下内容:
src_account |
order_number |
|---|---|
7 |
304330008004315 |
7 |
304120005529714 |
16 |
103650009791820 |
20 |
304120005529714 |
20 |
302290001255747 |
查找与标签表达式和属性过滤条件匹配的所有边缘
以下查询中的边模式使用标签表达式和属性过滤条件来查找所有标记为 Transfers 且与指定订单号匹配的边:
GRAPH graph_db.FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number;
结果类似于以下内容:
src_account |
order_number |
|---|---|
7 |
304120005529714 |
20 |
304120005529714 |
使用任意方向边缘模式查找所有边
您可以在查询中使用 any direction 边缘模式 (-[]-) 来匹配任意方向的边缘。以下查询会查找涉及被屏蔽账号的所有资金转移:
GRAPH graph_db.FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;
结果类似于以下内容:
order_number |
amount |
|---|---|
304330008004315 |
300 |
304120005529714 |
100 |
103650009791820 |
300 |
302290001255747 |
200 |
路径模式
路径模式由交替的节点模式和边缘模式构建而成。
使用路径模式查找特定节点的所有路径
以下查询会查找从 Person 所拥有且 id 等于 2 的账号发起的所有针对账号的资金转移。
每个匹配的结果都表示一条路径,该路径从 Person 节点开始(当 id 等于