注释
此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
使用图形模式匹配,可以使用直观的视觉语法描述要查找的数据的结构。 无需联接表,而是编写类似于关系本身的模式-由边缘连接的节点。 本文介绍如何在 Microsoft Fabric 中为图形中的常见方案编写 GQL 模式查询。
这些示例使用 社交网络示例数据集。 有关完整模式语法参考,请参阅 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 NULL 后 OPTIONAL MATCH 查找最多 100 名不在任何公司工作的人员:
MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100