图表查询概览

本文简要介绍了图查询语言 (GQL) 以及如何为 BigQuery Graph 编写图查询。您可以运行图查询,以查找模式、遍历关系并从属性图中获取数据洞见。本文档中的示例引用了一个名为 FinGraph 的图,该图显示了人、他们拥有的账号以及账号之间的转账关系。如需了解图表的定义,请参阅 FinGraph 示例

查询结构

图表查询由图表的名称以及一个或多个线性查询语句组成。每个线性查询都包含一个或多个语句,这些语句可让您处理图数据,以查找模式匹配项、定义变量、过滤和转换中间数据,以及返回结果。您可以通过与在 BigQuery 中运行 SQL 查询相同的方式运行图查询。

图查询结构示例。
图查询的结构示例。

图表模式匹配

图表模式匹配可在图表中查找特定模式。最基本的模式是元素模式,例如匹配节点的节点模式和匹配边的边模式。

节点模式

节点模式用于匹配图表中的节点。此模式包含一对匹配的圆括号,其中可选择包含图形模式变量、标签表达式和属性过滤器。

查找所有节点

以下查询会返回图表中的所有节点。变量 n(称为图表模式变量)会绑定到匹配节点。在这种情况下,节点模式会匹配图表中的所有节点。

GRAPH graph_db.FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;

此查询会返回 labelid

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

查找与标签表达式匹配的所有节点

您可以创建包含一个或多个逻辑运算符的标签表达式。 例如,以下查询会匹配图表中具有 PersonAccount 标签的所有节点。图表模式变量 n 公开具有 PersonAccount 标签的节点的所有属性

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 子句过滤属性 birthday1990-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 等于