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

点模式

点模式是用于从属性图中匹配点的常用模式。每个点模式由使用圆括号(())包围的一个点模式填充器组成。点模式填充器指定要匹配的点的详细信息,包括点的标签和属性等。

下文根据声明时的出场顺序,列出了支持的点模式填充器类型的组件:

  1. 点变量
  2. 标签表达式
  3. 点类型
  4. 点属性
  5. WHERE 子句

声明包含多个组件的点模式填充器时,须满足以下条件:

  • 至多使用三个不同类型的组件,其中:
    • 一个可以是点变量。
    • 一个可以是标签表达式或点类型。
    • 一个可以是点属性或 WHERE 子句。
  • 多个组件的顺序必须遵循上文规定的顺序。

以下为点模式填充器的语法概览:

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_pattern_filler_with_node_property_specification
{ property_name : value_expression , }
node_pattern_filler_with_WHERE_clause
WHERE search_condition

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的点模式。标签表达式可以独立用于声明点模式,而无需额外的点变量。如果点在匹配后,不需要被引用或者操作,可省略点变量。

更多信息,请参见标签表达式。

Note

在MATCH语句中,当点模式使用标签名时,标签可以通过字面标签名或字符串变量来指定。示例请参见 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 语句。

示例:

  • 用单个点类型匹配点:
    '''
    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的通用区别,请参见图模式。

在点模式里,最常见的区别是:

  • 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 子句。