概述
点模式和边模式统称为元素模式,它们是路径模式的组成部分。
点模式
点模式用于匹配图中的点,以一对圆括号()
表示。点模式由三个可选的部分依次组成:
<node pattern> ::=
"(" [ <node variable declaration> ]
[ <label 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)
边模式
边模式用于匹配图中的边,通常两端分别连接点模式使用,实际上形成路径模式。如果边模式两端没有书写点模式,系统假定其两边连接隐式空点模式。
<edge pattern> ::= <full edge pattern> | <abbreviated edge pattern>
完整边模式
完整边模式由一对方括号[]
和边方向(左向/入方向、右向/出方向或任意方向)表示。除方向外,完整边模式由三个可选的部分依次组成:
<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 expression> ]
[ <property specification> | <where clause> ]
匹配图中所有边并将其与变量e
绑定:
()-[e]->()
匹配属性role
有特定值的出方向WorkingIn
边,并将其与变量e
绑定:
()-[e:WorkingIn {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
标签表达式
标签表达式是布尔谓词,以冒号:
或关键字IS
开头,在点模式或完整边模式中使用。标签表达式指定一个或多个标签(Schema),当与点或边的标签匹配时,返回真。
匹配Movie
点:
(m:Movie)
等同于:
(m IS Movie)
标签表达式可以使用以下运算符组合多个标签:
运算符 | 描述 | 优先级 |
---|---|---|
() |
分组 | 1(最高) |
! |
非(NOT) | 2 |
& |
与(AND) | 3 |
| |
或(OR) | 4 |
匹配Movie
或Country
点:
(n:Movie|Country)
匹配标签不是LIVING_IN
的边:
()-[e:!LIVING_IN]-()
匹配标签不是Movie
或Country
的点:
(n:!(Movie&Country))
在嬴图数据库中,每个点或边都有且仅有一个标签。因此,以下语句永远无法匹配到点:
(n:Movie&Country)
通配符%
可以用来匹配任何标签:
(n:%)
属性规范
属性规范用一对花括号{}
包裹一个或多个属性键值对,在点模式或完整边模式中使用,它通过联合相等性,根据属性值来筛选点或边。
匹配属性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