Neo4j已经更新到4.0版本了,本文Cypher的相关查询语言也是匹配最新的4.0版本,后续版本肯定会不断更新,基本的查询应该不会有太大变动,希望这个速查表系列对大家有帮助。
1. 基本操作符
-
常见操作符
DISTINCT 去重
‘.’ 节点或关系的属性,比如n.name
-
算术运算
+, -, *, /, %, ^(加,减,乘,除,求余,乘方)
-
比较运算
=, <>, <, >, <=, >=, IS NULL, IS NOT NULL
备注:‘<>’不等
-
布尔运算
AND, OR, XOR, NOT (异,或,异或,非)
-
字符串操作
+ 主要用作字符串拼接
-
列表操作
+ 列表拼接
IN 判断元素是否在列表中
[x .. y] 列表形式
-
正则表达式
=~
-
字符串匹配
STARTS WITH 以 开头字符串
ENDS WITH 以 结尾字符串
CONTAINS 包含子字符串的字符串
2. null
-
null是用来指代缺失值或未定义值
-
两个null值是不相等的,因此null = null并不是True;如果真的去查看一个值是不是null,需要使用is null。
-
如果尝试获取一个列表中不存在的元素或者节点或关系不存在的属性值,则会返回null
-
在OPTIONAL MATCH 语句中, 使用nulls作为表达式缺失的部分
3. 基本表达式
-
(n:Person)
带label的节点
-
(n:Person:Swedish)
带多个labels的节点
-
(n:Person {name: $value})
声明属性值的节点 注:$value指变量,这里也可以是具体值
-
()-[r {name: $value}]-()
声明属性值的关系
-
(n)-->(m)
从n到m的路径
-
(n)--(m)
n与m无向关系的路径
-
(n:Person)-->(m)
从指明label的n到m的路径
-
(m)<-[:KNOWS]-(n)
n到m指明关系类型的路径
-
(n)-[:KNOWS|:LOVES]->(m)
n到m指明多个关系类型的路径,一条关系只能有一个关系type,因此这个‘|’是或的意思
-
(n)-[r]->(m)
将关系指代为变量r
-
(n)-[*1..5]->(m)
从n到m关系数量为1至5条,也可以说从n到m的1至5度范围
-
(n)-[*]->(m)
从n到m有任意关系数
-
(n)-[:KNOWS]->(m {property: $value})
既声明关系类型又声明终止节点label
-
shortestPath((n1:Person)-[*..6]-(n2:Person))
n1与n2两个人物节点6度范围内的最短路径
-
allShortestPaths((n1:Person)-[*..6]->(n2:Person))
n1与n2两个人物节点6度范围内的所有最短路径
-
size((n)-->()-->())
计算一条路径度数即含有关系数量
4. Labels 节点标签
-
CREATE (n:Person {name: $value})
创建一个带标签及属性的节点
-
MERGE (n:Person {name: $value})
匹配或新建唯一的节点
-
SET n:Spouse:Parent:Employee
给节点添加多个标签
-
MATCH (n:Person)
匹配标签为‘Person’的节点
-
MATCH (n:Person) WHERE n.name = $value
匹配标签为‘Person’且指定属性值的节点
-
WHERE (n:Person)
查看节点存在某个label
-
labels(n)
节点的labels,是一个列表
-
REMOVE n:Person
删除节点的label
5. Lists 列表
-
['a', 'b', 'c'] AS list
使用中括号[]声明一个list
-
size($list) AS len, $list[0] AS value
使用list作为变量参数
-
range($firstNum, $lastNum, $step) AS list
使用range()生成列表
-
MATCH p = (a)-[:KNOWS*]->() RETURN relationships(p) AS r
获取一个路径中所有关系的列表
-
RETURN matchedNode.list[0] AS value, size(matchedNode.list) AS len 节点的属性值可能是字符串、数字或布尔值这都可以是作为列表操作 -
list[$idx] AS value, list[$startIdx..$endIdx] AS slice
列表某个值 列表切片
-
UNWIND $names AS name MATCH (n {name: name}) RETURN avg(n.age)
使用UNWIND将列数据转为行数据,匹配names列表中所有name的节点并计算这些节点的年龄均值
-
MATCH (a) RETURN [(a)-->(b) WHERE b.name = 'Bob' | b.age]
匹配a节点,并返回所有a节点相连的名为‘Bob’的b节点的年龄
-
MATCH (person) RETURN person { .name, .age}
返回节点特定属性
6. Maps 对象
-
{name: 'Alice', age: 38, address: {city: 'London', residential: true}}
这是map基本形式,map中值也支持list,但是需要注意map与python中字典有些不同,key不带引号。
-
WITH {person: {name: 'Anne', age: 25}} AS p RETURN p.person.name
获取嵌套map的属性
-
MERGE (p:Person {name: $map.name}) ON CREATE SET p = $map
设定的map可以作为参数
-
MATCH (matchedNode:Person) RETURN matchedNode
返回的节点或关系是一个map结构的数据
-
map.name, map.age, map.children[0]
对于map实体可以通过key获取值
未完待续。。。
注意:本文归作者所有,未经作者允许,不得转载