Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/ Documentation version: v5.3.2 # 图模式 图模式匹配是通过将 GQL 标准定义的正则表达式与属性图进行匹配,以获得简化后的匹配结果的过程。 一个图模式是由多个路径模式组成的列表,而每个路径模式又是由交替出现的点模式和边模式组成的列表。路径模式以点模式开始并以点模式结束。以下是一个包含两个点模式(别名分别为`a`和`b`)和一个边模式(别名为`e`,标签为`KNOWS`)的路径模式示例。在`a`的点模式中,声明了在属性`id`上的过滤条件`WHERE`。 `(a:Person WHERE a.id IN LIST[2, 3, 4, 888])-[e:KNOWS]->(b)` GQL 中我们将路径定义为图论中的 WALK,即一个点或边可以在路径中多次出现。如果需要找到包含不同点和边的路径,可以在模式中声明过滤条件以排除重复的点和边。 更多信息,请参见: - [点模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/) - [边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/) - [路径模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/path-patterns/) []() ## 标签表达式 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`。更多信息,请参见[标签谓词](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/predicates/labeled/)。 ### 类型指定 类型指定支持用`@[Type1, Type2]`列出多个类型。例如: - `(v@[Actor,Director])`匹配点类型为`Actor`或`Director`的点。 - `[e@[Watch,Direct]]`匹配边类型为`Watch`或`Direct`的边。 ### 结果范围的区别 以[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)为例,点类型`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 [...]`),这种写法通常会降低查询性能。 更多信息,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)、[点模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/)和[边模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/edge-patterns/)。