图模式¶
图模式匹配是通过将 GQL 标准定义的正则表达式与属性图进行匹配,以获得简化后的匹配结果的过程。
一个图模式是由多个路径模式组成的列表,而每个路径模式又是由交替出现的点模式和边模式组成的列表。路径模式以点模式开始并以点模式结束。以下是一个包含两个点模式(别名分别为a和b)和一个边模式(别名为e,标签为KNOWS)的路径模式示例。在a的点模式中,声明了在属性id上的过滤条件WHERE。
(a:Person WHERE a.id IN LIST[2, 3, 4, 888])-[e:KNOWS]->(b)
GQL 中我们将路径定义为图论中的 WALK,即一个点或边可以在路径中多次出现。如果需要找到包含不同点和边的路径,可以在模式中声明过滤条件以排除重复的点和边。
更多信息,请参见:
标签表达式 vs. 类型指定¶
在 GQL 模式中,常见的元素限定方式有两种:
- 标签表达式使用
:或IS前缀,按标签过滤图元素。 - 类型指定使用
@前缀,按点类型或边类型过滤图元素。
两者的核心区别在于:
- 类型是图类型中的结构定义,决定属性集合、主键,以及边的起点和终点约束。
- 标签是图元素的语义分类,同一个标签可以被多个类型复用。
因此,类型查询通常更精确,适合限定某一种明确的结构;标签查询通常更灵活,适合跨多种类型按共同语义筛选。
标签表达式¶
标签表达式支持|(或者)、&(并且)和!(取反)运算符。例如:
(v:Person|Movie)匹配标签为Person或Movie的点。(v:Person&Movie)匹配标签同时为Person和Movie的点。[e:!Act]匹配标签不为Act的边。
需要注意,标签在不同上下文中的语法不同:
- 在模式填充器中,标签表达式直接跟在变量后,使用
:或IS,例如(v:Person)或(v IS Person)。 - 在 WHERE 子句中,标签匹配使用标签谓词,完整写法是
v IS LABELED Person。例如:MATCH (v)-[e]->() WHERE v IS LABELED Person RETURN v。
其中,在WHERE子句中也可以使用冒号(:)作为IS LABELED的简写,例如WHERE e:Act。更多信息,请参见标签谓词。
类型指定¶
类型指定支持用@[Type1, Type2]列出多个类型。例如:
(v@[Actor,Director])匹配点类型为Actor或Director的点。[e@[Watch,Direct]]匹配边类型为Watch或Direct的边。
结果范围的区别¶
以示例数据集为例,点类型Actor、Director和User都带有Person标签。因此:
MATCH (v@Actor)仅匹配Actor点。MATCH (v:Person)会匹配所有带有Person标签的点,包括Actor、Director和User。
边模式同理。如果多个边类型复用了同一个标签,那么:
MATCH ()-[e@Click]->()仅匹配Click边类型。MATCH ()-[e:Behavior]->()会匹配所有带有Behavior标签的边。
何时使用¶
- 需要按 Schema 中的结构类型精确匹配时,使用
@类型名。 - 需要按语义标签跨类型筛选时,使用
:标签或IS LABELED。
两种方式都在模式中过滤,并允许优化器使用索引。应避免在WHERE子句中过滤类型(例如WHERE type(e) IN [...]),这种写法通常会降低查询性能。