Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/node-patterns/ Documentation version: v5.3.2 # 点模式 点模式是用于从属性图中匹配点的常用模式。每个点模式由使用圆括号(`()`)包围的一个点模式填充器组成。点模式填充器指定要匹配的点的详细信息,包括点的标签和属性等。 下文根据声明时的出场顺序,列出了支持的点模式填充器类型的组件: 1. 点变量 2. 标签表达式 3. 点类型 4. 点属性 5. WHERE 子句 声明包含多个组件的点模式填充器时,须满足以下条件: - 至多使用三个不同类型的组件,其中: - 一个可以是点变量。 - 一个可以是标签表达式或点类型。 - 一个可以是点属性或 WHERE 子句。 - 多个组件的顺序必须遵循上文规定的顺序。 以下为点模式填充器的语法概览: 语法图源码 node_pattern_filler_with_node_variable node_pattern_filler_with_label_expression node_pattern_filler_with_node_type_specification node_pattern_filler_with_node_property_specification node_pattern_filler_with_WHERE_clause ```` node_pattern_filler_with_node_variable ::= node_variable node_pattern_filler_with_label_expression ::= ( ':' | 'IS' ) label_expression node_pattern_filler_with_node_type_specification ::= '@' ( node_type_name | '[' node_type_name ( ',' node_type_name ) * ']' ) node_pattern_filler_with_node_property_specification ::= '{' ( property_name ':' value_expression ) ( ',' ( property_name ':' value_expression ) ) * '}' node_pattern_filler_with_WHERE_clause ::= 'WHERE' search_condition ```` Note 圆括号(`()`)是点模式声明的一部分,用于包围点模式填充器。为了清晰起见,以下语法示例中保留了圆括号。 ## 使用点变量的点模式 ```` '(' node_variable ')' ```` - `node_variable`:点变量。 使用变量声明点模式填充器非常简单,点变量由一个常规标识符指定,用于在查询中绑定和引用匹配的点。例如,`(v)`是一个简单的点模式,它可以匹配图中的任何点,在查询的其他部分可以通过`v`引用这些匹配到的点。 示例: ```` ''' USE movie MATCH (v) RETURN v LIMIT 3 ''' ```` ## 使用标签表达式的点模式 ```` '(' ( ':' | 'IS' ) label_expression ')' ```` - `label_expression`:标签表达式。 标签表达式可以用来声明匹配有特定标签的点模式填充器。标签表达式可以用冒号 (`:`) 或关键字`IS`作为前缀。例如,`(:Person)`是一个匹配标签为`Person`的点模式。标签表达式可以独立用于声明点模式,而无需额外的点变量。如果点在匹配后,不需要被引用或者操作,可省略点变量。 更多信息,请参见[标签表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/label/)。 Note 在`MATCH`语句中,当点模式使用标签名时,标签可以通过字面标签名或字符串变量来指定。示例请参见 [MATCH 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/)。 示例: - 匹配带有单个标签的点: ```` ''' USE movie MATCH (v:Person) RETURN v.name AS name LIMIT 3 ''' ```` - 使用“或者”运算符(`|`)匹配标签为`Person`或`Movie`的点: ```` ''' USE movie MATCH (v:Person|Movie) RETURN v.name AS name LIMIT 3 ''' ```` - 使用“并且”运算符(`&`)匹配同时具有标签`Person`和`Movie`的点: ```` ''' USE movie MATCH (v:Person&Movie) RETURN v.name AS name LIMIT 3 ''' ```` - 使用取反运算符(`!`)排除某个标签: ```` ''' USE movie MATCH (v:Person&!Movie) RETURN v.name AS name LIMIT 3 ''' ```` ## 指定点类型的点模式 ```` '(' '@' ( node_type_name | '[' node_type_name ( ',' node_type_name ) * ']' ) ')' ```` - `node_type_name`:点类型名称。 点模式填充器可以通过指定点类型来声明。以`@`符号为前缀指定点类型的名称。例如,`(@User)`是一个点模式,匹配点类型为`User`的点。您也可以指定多个点类型。例如,`(@[User, Actor])`是一个点模式,匹配点类型为`User`或`Actor`的点。 Note 在`MATCH`语句中,当点模式指定点类型时,点类型也可以通过字符串变量来提供。示例请参见 [MATCH 语句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/match/)。 示例: - 用单个点类型匹配点: ```` ''' USE movie MATCH (v@Actor) RETURN v.name AS name LIMIT 3 ''' ```` - 用多个点类型匹配点: ```` ''' USE movie MATCH (v@[Actor,Director]) RETURN v.name AS name LIMIT 3 ''' ```` ### 点类型查询与标签查询的区别 点模式中,`@点类型名`和`:标签` / `IS LABELED`的通用区别,请参见[图模式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/patterns/#标签表达式-vs-类型指定)。 在点模式里,最常见的区别是: - `MATCH (v@Actor)`只匹配某一个明确的点类型。 - `MATCH (v:Person)`可以跨多个点类型匹配共享同一标签的点。 如果标签写在点模式中,使用的是点模式语法,例如`(v:Person)`或`(v IS Person)`;如果标签写在`WHERE`子句中,使用的是标签谓词语法,例如`WHERE v IS LABELED Person`。 如果需要先按点类型缩小范围,再按标签进一步过滤,也可以组合使用,例如: ```` ''' USE movie MATCH (v@Actor) WHERE v IS LABELED Person RETURN v.name AS name LIMIT 3 ''' ```` 上述示例的`WHERE`条件在该数据集中是冗余的,但在需要显式表达“先限定类型,再验证标签”时仍然可以使用。 ## 指定点属性的点模式 ```` '(' '{' ( property_name ':' value_expression ) ( ',' ( property_name ':' value_expression ) ) * '}' ')' ```` - `property_name`:属性名称。 - `value_expression`:值表达式。 点模式填充器可以通过指定属性来声明。每个属性本质上是一个属性名称和值表达式的组合,属性名称和值表达式之间用冒号 (`:`) 分隔。多个属性用逗号(`,`)分隔,并用花括号(`{}`)括起来作为一个列表。例如,`({id:1,name:"Bob"})`声明了一个点模式,匹配`id`属性等于`1`且`name`属性等于`Bob`的点。而`(v{id:1})`等同于`(v WHERE v.id = 1)`。 示例: ```` ''' USE movie MATCH (v {id:1}) RETURN v.name AS name, type(v) ''' ```` ## 使用 WHERE 子句的点模式 ```` '(' 'WHERE' search_condition ')' ```` - `search_condition`:搜索条件。 点模式可以用包含过滤条件的`WHERE`子句来声明。例如,`(WHERE true)`和`(WHERE false)`分别匹配所有点和不匹配任何点。`(v WHERE v.id = 1)`匹配`id`属性等于`1`的点。 示例: ```` ''' USE movie MATCH (v WHERE v.id = 1 AND v IS LABELED Person) RETURN v.name AS name, type(v) ''' ```` 更多信息,请参见 [WHERE 子句](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/where/)。