注释
此功能目前处于公开预览状态。 此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负荷。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款。
图形模式是 GQL 查询的核心构建基块。 它们以直观的直观方式描述在图形中使用节点和边缘查找的结构。 将图形模式视为查询引擎尝试与图形中实际数据匹配的模板。
重要
本文仅使用 社交网络示例图数据集。
简单元素模式
简单元素模式有助于匹配图形中满足特定要求的单个节点和边缘。 这些模式构成了更复杂的模式匹配的基础。
简单节点模式
节点模式指定节点必须匹配的标签和属性:
(:City { name: "New York" })
此模式 匹配所有同时 具有 Place 和 City 标签的节点(由 & 运算符指示),并且其 name 属性相等 "New York"。 此规范的必需标签和属性称为节点模式的 填充 。
关键概念:
-
标签匹配:用于
&要求多个标签。 - 属性筛选:指定属性必须匹配的确切值。
- 灵活(“协变”)匹配:匹配的节点可以具有超出指定标签和属性的标签和属性。
注释
多元素标签的图模型尚未被支持(已知问题)。
简单边缘模式
边缘模式比节点模式更为复杂。 它们不仅指定填充,而且还将源节点模式连接到目标节点模式。 边缘模式描述边缘及其终结点的要求:
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
箭头方向 -[...]-> 非常重要-它确定 (:Person) 为源节点模式和 (:Comment) 目标节点模式。 了解边缘方向对于正确查询图形至关重要。
等效镜像模式:
可以翻转箭头并交换节点模式来创建等效的镜像边缘模式:
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
此模式查找相同的关系,但从相反的角度来看。
任何定向边缘模式
当图形边缘的方向对查询无关时,可以通过创建任何定向边缘模式来不指定它:
(:Song)-[:inspired]-(:Movie)
此模式与和(:Song)-[:inspired]->(:Movie)组合的边缘(:Movie)-[:inspired]->(:Song)匹配,无论哪个节点是源,哪个节点是目标(此示例不是来自社交网络图形类型)。
图形边缘模式快捷方式
GQL 为常见边缘模式提供了方便的快捷方式,使查询更加简洁:
-
()->()代表()-[]->()(具有任何标签的定向边缘) -
()<-()代表()<-[]-()(使用任何标签反向定向边缘) -
()-()代表()-[]-()(任何标签的任意定向边缘)
当你关心连接而不是特定图形边缘类型时,这些快捷方式非常有用。
标签表达式
模式可以在匹配节点和边缘的标签上表达复杂的要求。
Example:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
这会计算连接到isLocatedIn节点或节点(Person但不是)Organization节点(始终Company是社交网络架构中的节点)University或City节点的边缘数Country。
语法:
| Syntax | Meaning |
|---|---|
A&B |
标签需要同时包含 A 和 B。 |
A|B |
标签至少需要包含 A 或 B 之一。 |
!A |
标签需要排除 A。 |
此外,使用括号来控制标签表达式计算的顺序。 默认情况下, ! 优先级最高, & 优先级高于 |。 因此 !A&B|C|!D ,与 ((!A)&B)|C|(!D)..
绑定变量
变量允许引用查询其他部分中匹配的图形元素。 了解如何绑定和使用变量对于生成强大的查询至关重要。
Binding 元素变量
节点模式和边缘模式都可以将匹配的节点和边缘绑定到变量以供以后参考。
(p:Person)-[w:workAt]->(c:Company)
在此模式中,p绑定到匹配节点、Person匹配wworkAt边缘和c匹配Company节点。
结构约束的变量重用:
多次在模式中重用同一变量表示对匹配结构的限制。 同一变量的每个匹配项都必须始终绑定到有效匹配中的同一图形元素。 变量重用对于表达复杂的结构要求非常强大。
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
该模式查找Person节点并x相互了解并在同一y位置工作,该节点Company绑定到变量c。
c重复使用可确保两人在同一家公司工作。
使用元素变量的模式谓词:
使用绑定元素变量可以指定节点和边缘模式谓词。 填充器可以指定为每个候选元素计算的谓词,而不是只提供精确属性值的 { name: "New York, USA" }填充物。 仅当谓词的计算结果为 TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
边缘模式发现自 2000 年 1 月 1 日起相互了解的人使用灵活的条件而不是完全匹配。
注释
边缘模式变量始终绑定到边缘模式谓词中的单个边缘,即使使用可变长度模式也是如此。 这可以帮助无需取消引入边缘组列表变量即可执行后期筛选器。 请参阅 Bind 可变长度模式边缘变量。
高级模式谓词技术:
模式谓词提供强大的内联筛选功能,可提高查询可读性:
-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
-[:workAt]->
(c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')
-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z')
AND w.salary > 75000]-(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE
-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target
小窍门
当条件高度选择性时,使用模式谓词可以减少中间结果的大小。
绑定路径变量
还可以将匹配的路径绑定到路径变量,以便进一步处理或向用户返回完整的路径结构:
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
此处, p 绑定到表示完整匹配的路径结构的路径值,包括给定顺序中所有节点和边缘的引用值。
绑定路径可以返回给用户,或通过类似 NODES 或 EDGES的函数进一步处理:
MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges
撰写模式
实际查询通常需要比简单的节点边缘节点结构更复杂的模式。 GQL 提供了多种方法来为复杂的图形遍历编写模式。
撰写路径模式
可以通过连接简单节点和边缘模式来创建较长遍历来构成路径模式。
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
该模式通过社交和专业联系从某人遍历,以查找同事的公司所在的位置。
条形图案构造: 还可以以增量方式生成路径模式,从而使复杂模式更易于阅读和理解:
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
此方法将相同的遍历分解为逻辑步骤,以便更轻松地理解和调试。
撰写非线性模式
图案的结果形状不必是线性路径。 可以匹配更复杂的结构,例如从中心节点辐射的“星形”模式:
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
该模式可同时查找一个人及其教育、就业和内容首选项 ,这是一个全面的个人资料查询。
匹配跟踪
在复杂模式中,多次遍历同一边缘通常是不可取的。 当实际图形包含可能导致无限或长路径的周期时,边缘重用变得非常重要。 若要处理边缘重用,Microsoft Fabric 中的图形支持 TRAIL 匹配模式。
使用关键字 TRAIL 为路径模式添加前缀会放弃多次绑定同一边缘的所有匹配项:
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
TRAIL通过使用,模式仅生成匹配项,其中所有边缘都不同。 因此,即使 c = a 这样,路径在给定的匹配中形成一个循环, e3 也永远不会绑定到与 e1同一边缘。
该 TRAIL 模式对于防止无限循环并确保查询返回有意义的非已解决路径至关重要。
使用可变长度模式
可变长度模式是功能强大的构造,可用于查找不同长度的路径,而无需编写重复的模式规范。 它们对于遍历层次结构、社交网络和其他结构至关重要,在这些结构中,最佳路径长度事先未知。
有限可变长度模式
重要
有限可变长度模式目前仅支持最大上限为 8。 请参阅有关当前 限制的文章。
许多常见的图形查询需要多次重复相同的边缘模式。 而不是编写详细模式,例如:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
可以使用更简洁的可变长度语法:
(:Person)-[:knows]->{3}(:Person)
指定{3}-[:knows]->边缘模式应重复三次。
灵活的重复范围: 为提高灵活性,可以为重复指定下限和上限:
(:Person)-[:knows]->{1, 3}(:Person)
此模式在单个查询中查找直接的朋友、好友和好友好友。
注释
下限也可以。0 在这种情况下,不会匹配任何边缘,并且整个模式仅在两个终结点节点模式匹配同一节点时才匹配。
示例:
(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)
这种模式不仅匹配了彼此认识 的不同人,也 匹配了同一个人—— p1p2 即使那个人自己并不“了解”。
如果未指定下限,则通常默认为 0(零)。
复变长度组合: 可变长度的模式可以作为更大、更复杂模式的一部分,如下查询所示:
MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
(c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100
此模式查找一对评论,其中了解彼此的人喜欢不同的批注,这些批注通过每个级别为 1-5 个级别的回复链进行连接。
绑定可变长度模式边缘变量
绑定可变长度边缘模式时,边缘变量的值和类型会根据引用上下文而更改。 了解此行为对于正确处理可变长度匹配至关重要:
两个参考度:
- 在可变长度模式内:图形边缘变量绑定到匹配路径上的每个单个边缘(也称为“单一引用度”)
- 在可变长度模式之外:图形边缘变量绑定到匹配路径上所有边缘的序列(也称为“组引用度”)
演示这两个上下文的示例:
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
边缘变量 e 的计算发生在两个上下文中:
在
MATCH声明中:查询查找自 2000 年以来建立每个友谊的朋友的链。 在模式匹配期间,将为每个候选边缘评估一次边缘模式谓词e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")。 在此上下文中,e绑定到单个边缘引用值。在语句中
RETURN:此处,e按照边缘引用值在匹配链中出现的顺序绑定到边缘引用值的(组)列表。 结果是e[0]每个匹配链中的第一个边缘引用值。
水平聚合中的可变长度模式边变量:
由可变长度模式匹配约束的边变量是可变长度模式之外的组列表,因此可用于水平聚合。
MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100
更多细节请参见水平 聚合 部分。