在 Microsoft Fabric 中编写图形模式查询

注释

此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

使用图形模式匹配,可以使用直观的视觉语法描述要查找的数据的结构。 无需联接表,而是编写类似于关系本身的模式-由边缘连接的节点。 本文介绍如何在 Microsoft Fabric 中为图形中的常见方案编写 GQL 模式查询。

这些示例使用 社交网络示例数据集。 有关完整模式语法参考,请参阅 GQL 图形模式

先决条件

  • 加载数据的图形项。 如果你不熟悉图形,请先完成 本教程
  • 熟悉基本 MATCH 查询和 RETURN 查询。 请参阅 GQL 语言指南

匹配直接关系

基本模式与节点类型、特定边缘类型和另一个节点类型匹配。 语法类似于关系图。

例如,要查找不超过 100 人,并将他们与就职的公司匹配:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

当不知道或不关心方向时,请使用无向边缘模式。 例如,若要查找最多 100 个相互熟人,无论谁发起连接:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

注释

graph 当前不支持创建无向边缘,但可以使用 -[:label]- 语法查询任何方向的边缘。

使用内联 WHERE 筛选过滤模式

为了在匹配时筛选节点和边缘,请将 WHERE 放置在模式中。 这种方法比在事情发生之后再进行过滤更有效。

例如,若要查找在 1990 年之前出生,并在公司名称以“A”开头的公司工作的人:

MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

筛选边缘属性以限制哪些关系匹配。 例如,仅返回在 2010 年或更晚开始在公司工作的员工:

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom

匹配多跃点关系

使用可变长度模式在一个表达式中遍历多个跃点。 使用 {min,max} 语法指定最小和最大跃点数。

例如,若要在爱丽丝的两到四度友谊范围内找到多达 100 人:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

若要从 Alice 找到最多 100 个即时和二度连接(一个或两个跃点):

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

使用路径模式控制遍历

默认情况下,GQL 使用 TRAIL 模式,这会阻止多次遍历同一边缘。 如果需要不同的保证,请显式使用路径模式。

路径模式 Behavior 在以下情况下使用...
WALK 允许重复的节点和边缘 需要没有限制的原始遍历。 很少需要;主要用于探索性查询。
TRAIL 无重复边缘(默认值) 你想要避免重复追溯相同的关系,但同一节点可以通过不同的关系出现。 适用于大多数遍历查询。
SIMPLE 除了开始和结束之外,没有重复的节点 希望路径的中间节点不重复出现,但允许路径回到起点。 可用于检测循环。
ACYCLIC 根本没有重复的节点 需要保证路径中任意位置没有节点出现多次。 用于严格的层次结构、谱系或任何遍历,在这些情况下,重新访问节点会导致结果错误。

WALK 是最宽松的模式,是 ACYCLIC 限制性最大的模式。 TRAIL 是默认值,适用于大多数查询。 仅在用例需要时才使用更严格的模式。

为了说明差异,请考虑 Alice → Bob → Carol → Bob 的路径:

  • WALK - 允许此路径。 节点和边缘可以自由重复。
  • TRAIL - 允许此路径。 Bob 出现两次,但使用的每个边缘都是不同的关系(Alice→Bob 和 Carol→Bob 是不同的边缘),因此不会重复任何边缘。
  • SIMPLE - 阻止此路径。 Bob 多次出现,SIMPLE 仅允许节点在路径的开始和结束(封闭周期)时重复。 此处 Alice 是开始,Bob 是终点,因此没有适用的例外。
  • ACYCLIC - 阻止此路径。 Bob 多次出现在路径中的任何位置。

以下示例演示如何使用 TRAIL 统计在 Alice 的网络中,在四个跃点内可以到达的前 100 个人各自有多少条不同的路径:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

使用 ACYCLIC 返回最多 100 名从 Alice 出发在四个跃点内能到达的人,其中路径中的每个人都是唯一的。

MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Tip

对于大型图形,始终对可变长度模式({1,4} 而不是 {1,})设置上限。 跨越密集图进行未限定的遍历可能会触发查询超时限制。 请参阅 当前限制

使用变量复用来表达共享实体

在模式的两个部分中重用同一变量会创建隐式相等约束 - 两个引用必须匹配同一节点。 使用此方法可以表达“查找通过共享第三个实体连接的实体”。

例如,要查找最多 100 对彼此认识且在同一家公司工作的人:

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

该变量 c 将重复使用这两 workAt 个目标,因此查询仅返回两个人相互了解 在同一家公司工作的对。

要查找最多 100 对喜欢同一篇帖子的成对用户:

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Tip

WHERE a.id < b.id 条件可防止重复对(Alice + Bob 和 Bob + Alice)出现在结果中。

合并多个模式

在单个 MATCH模式中列出多个模式,用逗号分隔。 所有模式必须至少共享一个变量,以便它们正确联接。

例如,若要查找多达 100 人以及他们居住的工作场所和城市:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

共享变量 p 连接这两种模式。 每个结果行代表一个人及其公司和城市。

匹配可选关系

当每个节点的关系可能不存在时使用 OPTIONAL MATCH 。 不带匹配项的行将与NULL值一起保留,类似于 SQL LEFT JOIN的结果。

例如,返回最多 100 人及其公司名称,包括没有雇主的人员(即返回 NULL 公司栏的人员):

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

使用 IS NULLOPTIONAL MATCH 查找最多 100 名不在任何公司工作的人员:

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100