跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

图模式

图模式匹配是通过将 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 [...]),这种写法通常会降低查询性能。

更多信息,请参见标签表达式、点模式和边模式。