一、类型
Cypher处理的所有值都有一个特定的类型,它支持如下类型:
- 数值型
- 字符串
- 布尔型
- 节点
- 关系
- 路径
- 映射(Map)
- 列表(List)
二、表达式
Cypher中的表达式如下:
- 十进制(整型和双精度型)的字面值:13, -4000, 3.14, 6.022E23
- 十六进制整型字面值(以0x开头):0x13zf, 0xFC3A9, -0x66eff
- 八进制整型字面值(以0开头):01372, 02127, -05671
- 字符串字面值:'Hello', "World"
- 布尔字面值:true, false, TRUE, FALSE
- 变量:n, x, rel, myFancyVariable, `A name with weird stuff in it[]!`
- 属性:n.prop, x.prop, rel.thisProperty, myFancyVariable. `(weird property name)`
- 动态属性:n["prop"], rel[n.city + n.zip], map[coll[0]]
- 参数:$param, $0
- 表达式列表:['a', 'b'], [1, 2, 3], ['a', 2, n.property, $param], [ ]
- 函数调用:length(p), nodes(p)
- 聚合函数:avg(x.prop), count(*)
- 路径-模式:(a)-->()<--(b)
- 计算式:1 + 2 >3 and 3 < 4.
- 返回true或者false的断言表达式:a.prop = 'Hello', length(p) >10, exists(a.name)
- 正则表达式:a.name =~ 'Tob.*'
- 大小写敏感的字符串匹配表达式:a.surname STARTS WITH 'Sven', a.surname ENDS WITH 'son' or a.surname CONTAINS 'son'
- CASE表达式
三、参数
Cypher支持带参数的查询。这意味着开发人员不是必须用字符串来构建查询。此外,这也让执行计划的缓存更容易。
参数能够用于WHERE语句中的字面值和表达式,START语句中的索引值,索引查询以及节点和关系的id。参数不能用于属性名、关系类型和标签,因为这些模式(pattern)将作为查询结构的一部分被编译进查询计划。
合法的参数名是字母,数字以及两者的组合。下面是一个使用参数的完整例子。参数以JSON格式提供。具体如何提交它们取决于所使用驱动程序。
{ "name" : "Johan" } |
Match (n) where n.name=$name return n
四、运算符
1、数学运算符
包括+,-,*,/ 和%,^。
2、比较运算符
包括=,<>,<,>,<=,>=,IS NULL和IS NOT NULL。
3、布尔运算符
包括AND,OR,XOR和NOT。
4、字符串运算符
连接字符串的运算符为+。正则表达式的匹配运算符为=~。
5、列表运算符
列表的连接也可以通过+运算符。可以用IN来检查列表中是否存在某个元素。
6、值的相等与比较
Cypher支持使用=和<>来比较两个值的相等/不相等关系。同类型的值只有它们是同一个值的时候才相等,如3 = 3和"x" <> "xy"。
7、值的排序与比较
比较运算符<=,<(升序)和>=,>(降序)可以用于值排序的比较。如下所示:
- 数字型值的排序比较采用数字顺序
- java.lang.Double.NaN大于所有值
- 字符串排序的比较采用字典顺序。如"x" < "xy"
- 布尔值的排序遵循false < true
- 当有个参数为null的时候,比较结果为null。如null < 3的结果为null
- 将其他类型的值相互比较进行排序将报错
8、链式比较运算
比较运算可以被任意地链在一起。如x < y <= z等价于x < y AND y <= z。如:
MATCH (n) WHERE 21 < n.age <= 30 RETURN n |
等价于
MATCH (n) WHERE 21 < n.age AND n.age <= 30 RETURN n |
五、注释
Cypher语言的注释类似其他语言,用双斜线//来注释行。例如:
MATCH (n) RETURN n //这是行末尾注释 MATCH (n) //这是整行注释 RETURN n MATCH (n) WHERE n.property = '//这不是注释' RETURN n |
六、模式(Patterns)
使用模式可以描述你期望看到的数据的形状。例如,在MATCH、CREATE、DELETE等语句中,当用模式描述一个形状的时候,Cypher将按照模式来获取相应的数据。
模式描述数据的形式很类似在白板上画出图的形状。通常用圆圈来表达节点,使用箭头来表达关系。节点模式
模式能表达的最简单的形状就是节点。节点使用一对圆括号表示,然后中间含一个变量名字。例如:
(a) |
这个模式描述了一个节点,其名称使用变量a表示。
关联节点的模式
模式可以描述多个节点及其之间的关系。Cypher使用箭头来表达两个节点之间的关系。例如:
(a)-->(b) |
例如:
(a)-->(b)<--(c) |
例如:
(a)-->()<--(c) |
标签
模式除了可以描述节点之外,还可以用来描述标签。比如:
(a:User)-->(b) |
也可以描述一个节点的多个标签,如:
(a:User:Admin)-->(b) |
指定属性
属性在模式中使用键值对的映射结构来表达,然后用大括号包起来。例如,一个有两个属性的节点如下所示:
(a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'}) |
关系中的属性:
(a)-[{blocked: false}]->(b) |
描述关系
如前面的例子所示,可以用箭头简单地描述两个节点之间的关系。它描述了关系的存在性和方向性。但如果不关心关系的方向,则箭头的头部可以省略。例如:
(a)--(b) |
与节点类似,如果后续需要引用到该关系,则可以给关系赋一个变量名。变量名需要用方括号括起来,放在箭头的短横线中间,如下所示:
(a)-[r]->(b) |
就像节点有标签一样,关系可以有类型(type)。给关系指定类型,如下所示:
(a)-[r:REL_TYPE]->(b) |
不像节点可以有多个标签,关系只能有一个类型。但如果所描述的关系可以是一个类型集中的任意一种类型,可以将这些类型都列入到模式中,它们之间以竖线“|”分割。如:
(a)-[r:TYPE1|TYPE2]->(b) |
注意:这种模式仅适用于描述已经存在的数据(如在MATCH语句中),而在CREATE或者MERGE语句中是不允许的,因为一个关系不能创建多个类型。
与节点类似,关系的命名也是可以省略的。如:
(a)-[:REL_TYPE]->(b) |
与使用一串节点和关系来描述一个长路径的模式不同,很多关系(以及中间的节点)可以采用指定关系的长度的模式来描述。例如:
(a)-[*2]->(b) |
它描述了一张三个节点和两个关系的图。这些节点和关系都在同一条路径中(路径的长度为2)。它等同于:
(a)-->()-->(b) |
关系的长度也可以指定一个范围,这被称为可变长度的关系。例如:
(a)-[*3..5]->(b) |
关系的长度最小值为3,最大值为5。它描述了一个或者有4个节点和3个关系,或者5个节点4个关系,或者6个节点和5个关系连在一起的图组成的一条路径。
长度的边界也是可以省略的,如描述一个路径长度大于等于3的路径:
(a)-[*3..]->(b) |
路径长度小于等于5的路径,如:
(a)-[*..5]->(b) |
两个边界都可以省略,这允许任意长度的路径,如:
(a)-[*]->(b) |
七、列表
Cypher对列表(list)有很好的支持。可以使用方括号和一组以逗号分割的元素来创建一个列表。
例如
RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list |
八、空值
空值null在Cypher中表示未找到或者未定义。从概念上讲,null意味着”一个未找到的未知值”。 对待null会与其他值有些不同。例如从节点中获取一个并不存在的属性将返回null。大多数以null作为输入的表达式将返回null。这包括WHERE语句中用于断言的布尔表达式。
null不等于null。两个未知的值并不意味着它们是同一个值。因此,null = null返回null而不是true。
判断 某个节点上 有或没有 某个属性,如下
Match (n) where n.name is null return n
Match (n) where n. name is not null return n
空值的逻辑运算
逻辑运算符(包括AND,OR,XOR,IN,NOT)把null当作未知的三值逻辑值。下面为AND,OR和XOR的逻辑值表。
a |
b |
a AND b |
a OR b |
a XOR b |
false |
false |
false |
false |
false |
false |
null |
false |
null |
null |
false |
true |
false |
true |
true |
true |
false |
false |
true |
true |
true |
null |
null |
true |
null |
true |
true |
true |
true |
false |
null |
false |
false |
null |
null |
null |
null |
null |
null |
null |
null |
true |
null |
true |
null |
空值与IN
IN运算符遵循类似的逻辑。如果列表中存在某个值,结果就返回true。如果列表包含null值并且没有匹配到值,结果返回null。否则结果为false。下面表中是一些例子:
表达式 |
结果 |
2 IN [1, 2, 3] |
true |
2 IN [1, null, 3] |
null |
2 IN [1, 2, null] |
true |
2 IN [1] |
false |
2 IN [] |
false |
null IN [1, 2, 3] |
null |
null IN [1, null, 3] |
null |
null IN [] |
false |
all, any, none和single与IN类似,如果可以确切地计算结果,将返回true或者false。否则将返回null。
返回空值的表达式
- 从列表中获取不存在的元素:[][0],head([])
- 试图访问节点或者关系的不存在的属性:n.missingProperty
- 与null做比较:1 < null
- 包含null的算术运算:1 + null
- 包含任何null参数的函数调用:sin(null)
九、节点语法
Cypher采用一对圆括号来表示节点。如:(), (foo)。下面是一些常见的节点表示法:
() (matrix) matrix为变量名 (:Movie) Movie为标签 (matrix:Movie) (matrix:Movie {title: "The Matrix"}) (matrix:Movie {title: "The Matrix", released: 1997}) |
若想查询返回某些东西,就必须命名变量名来查询:
Match (matrix:Movie {title: "The Matrix"}) return matrix
十、关系语法
Cypher使用一对短横线(即“-”)表示:一个无方向关系。有方向的关系在其中一段加上一个箭头(即“<-”或“->”)。方括号表达式[…]可用于添加详情。里面可以包含变量、属性和或者类型信息。关系的常见表达方式如下:
-- --> -[role]-> -[:ACTED_IN]-> -[role:ACTED_IN]-> -[role:ACTED_IN {roles: ["Neo"]}]-> |
CREATE(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),(LillyW)-[:DIRECTED]->(TheMatrix),(LanaW)-[:DIRECTED]->(TheMatrix),(JoelS)-[:PRODUCED]->(TheMatrix)
查询:
Match (n)-[role]->(m) return n, role ,m
Match (n)-->(m) return n ,m
Match (n)--(m) return n ,m
删除:
match(n),(m) optional match (n)-[r]-(m)delete r,n,m
十一、模式语法
将节点和关系的语法组合在一起可以表达模式。
(keanu:Person:Actor {name: "Keanu Reeves"})-[role:ACTED_IN {roles: ["Neo"]}]-> (matrix:Movie {title: "The Matrix"} ) |
十二、Case表达式
计算表达式的值,然后依次与WHEN语句中的表达式进行比较,直到匹配上为止。如果未匹配上,则ELSE中的表达式将作为结果。如果ELSE语句不存在,那么将返回null。
语法:
CASE test WHEN value THEN result [WHEN ...] [ELSE default] END |
参数:
- test:一个有效的表达式
- value:一个表达式,它的结果将与test表达式的结果进行比较
- result:如果value表达式能够与test表达式匹配,它将作为结果表达式
- default:没有匹配的情况下的默认返回表达式