概述
点模式和边模式统称为元素模式,它们是构建路径模式的基本组成单元。
点模式
点模式用于匹配图中的点,以一对圆括号()表示。点模式由三个可选的部分组成:
<node pattern> ::=
"(" [ <node variable declaration> ]
[ <label or schema expression> ]
[ <property specification> | <where clause> ] ")"
最简单的空点模式匹配图中任意点:
()
匹配Person点并将其与变量n绑定:
(n:Person)
匹配属性fullname和age为特定值的点:
({fullname: "John Doe", age: 30})
匹配age属性值大于30的Person点,并将其与变量n绑定:
(n:Person WHERE n.age > 30)
边模式
边模式用于匹配图中的边,通常两端分别连接点模式。如果边模式任意一端没有书写点模式,则其隐式连接一个空点模式。
边模式有两种,分别是完整边模式和简写边模式。
完整边模式
完整边模式由一对方括号[]表示,并包含边方向(左向/入方向、右向/出方向或任意方向)。完整边模式由三个可选的部分组成:
<full edge pattern> ::=
<full edge pointing left> | <full edge pointing right> | <full edge any direction>
<full edge pointing left> ::=
"<-[" <edge pattern filter> "]-"
<full edge pointing right> ::=
"-[" <edge pattern filter> "]->"
<full edge any direction> ::=
"-[" <edge pattern filter> "]-"
<edge pattern filter> ::=
[ <edge variable declaration> ]
[ <label or schema expression> ]
[ <property specification> | <where clause> ]
匹配图中所有边并将其与变量e绑定:
()-[e]->()
匹配属性role有特定值的Works_for边,并将其与变量e绑定:
()-[e:Works_for {role: "Manager"}]->()
匹配score属性值小于2的边,并将其与变量e绑定:
()<-[e WHERE e.score < 2]-()
简写边模式
简写边模式仅标明边方向(左向/入方向、右向/出方向或任意方向),不支持变量声明或模式过滤。
<abbreviated edge pattern> ::= "<-" | "->" | "-"
匹配User点通过一条出边可以到达的点:
(:User)->(n)
匹配图中的所有1步路径:
p = ()->()
语法元素
元素变量声明
点变量和边变量统称为元素变量。
点变量在点模式中声明,位于标签或属性过滤条件前,其变量值表示一组绑定的点。
变量n与Person点绑定:
MATCH (n:Person)
RETURN n.name
边变量在完整边模式中声明,位于标签或属性过滤条件前,其变量值表示一组绑定的边。
变量e与Follows边绑定:
MATCH ()-[e:Follows]->()
RETURN e
标签/Schema表达式
标签/Schema表达式以冒号:或关键词IS开头,在点模式或完整边模式中使用。标签/Schema表达式指定一个或多个标签/Schema。
匹配Movie点:
(m:Movie)
等同于:
(m IS Movie)
标签/Schema表达式支持以下运算符:
| 运算符 | 描述 | 优先级 |
|---|---|---|
() |
分组 | 1(最高) |
! |
非(NOT) | 2 |
& |
与(AND) | 3 |
| |
或(OR) | 4 |
匹配标签/Schema为Movie或Country的点:
(n:Movie|Country)
匹配同时有Teacher和Student标签/Schema的点:
(n:Teacher&Student)
匹配标签/Schema不是LIVING_IN的边:
()-[e:!LIVING_IN]-()
属性规范
属性规范用一对花括号{}包裹一个或多个属性键值对,在点模式或完整边模式中使用,它通过联合相等条件,根据属性值筛选点或边。
匹配属性type和level分别为特定值的点:
(n {type: "Gold", level: 5})
这个点过滤也可以使用WHERE从句实现:
(n WHERE n.type = "Gold" AND n.level = 5)
WHERE从句
在点模式或完整边模式里使用WHERE从句能过滤属性。同属性规范相比,WHERE从句能实现更灵活的过滤规则。
匹配属性level大于3的Card点:
(c:Card WHERE c.level > 3)
匹配属性amount和currency满足指定条件的边:
(:Card)-[t WHERE t.amount > 10000 AND t.currency = 'USD']->()
以下查询有语法错误,因为这里将amount视为变量。若要在WHERE从句里指定一个属性,需使用点运算符.从一个点变量或边变量引用该属性,如(n:Card WHERE n.amount > 100)。
MATCH p = (:Card WHERE amount > 100)-[]->()
RETURN p
以下查询有语法错误,因为不能在一个元素模式内同时使用属性规范和WHERE从句,需改写为(n:Paper WHERE n.author = "Alex" AND n.score > 5)。
MATCH (n:Paper {author: "Alex"} WHERE n.score > 5)
RETURN n