Neo4j Cypher查询语言详解Word下载.docx
《Neo4j Cypher查询语言详解Word下载.docx》由会员分享,可在线阅读,更多相关《Neo4j Cypher查询语言详解Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
RETURNuser,follower.name
操作符
Cypher中的操作符有三个不同种类:
数学,相等和关系。
数学操作符有+,-,*,/和%。
当然只有+对字符有作用。
等于操作符有=,<
>
,<
,>
=,>
=。
因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符?
和!
。
有些是用在属性上,有些事用于处理缺少值。
对于一个不存在的属性做比较会导致错误。
为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。
WHEREn.prop?
="
foo"
这个断言在属性缺失情况下将评估为true。
WHEREn.prop!
这个断言在属性缺失情况下将评估为false。
警告:
在同一个比较中混合使用两个符号将导致不可预料的结果。
参数
Cypher支持带参数的查询。
这允许开发者不需要必须构建一个string的查询,并且使得Cypher的查询计划的缓存更容易。
参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。
以下是几个在java中使用参数的示例:
节点id参数
Map<
String,Object>
params=newHashMap<
();
params.put("
id"
0);
ExecutionResultresult=engine.execute("
startn=node({id})returnn.name"
params);
节点对象参数
node"
andreasNode);
startn=node({node})returnn.name"
多节点id参数
Arrays.asList(0,1,2));
字符串参数
name"
"
Johan"
);
startn=node(0,1,2)wheren.name={name}returnn"
索引键值参数
key"
value"
Michaela"
startn=node:
people({key}={value})returnn"
索引查询参数
query"
name:
Andreas"
people({query})returnn"
▪SKIP与LIMIT*的数字参数
s"
1);
l"
startn=node(0,1,2)returnn.nameskip{s}limit{l}"
▪正则表达式参数
regex"
.*h.*"
startn=node(0,1,2)wheren.name=~{regex}returnn.name"
标识符
当你参考部分的模式时,需要通过命名完成。
定义的不同的命名部分就被称为标识符。
如下例中:
STARTn=node
(1)MATCHn-->
bRETURNb
标识符为n和b。
标识符可以是大写或小些,可以包含下划线。
当需要其他字符时可以使用符号。
对于属性名的规则也是一样。
注解
可以在查询语句中使用双斜杠来添加注解。
STARTn=node
(1)RETURNb//这是行结束注释
STARTn=node
(1)RETURNb
STARTn=node
(1)WHEREn.property="
//这部是一个注释"
RETURNb
Start
每一个查询都是描述一个图案(模式),在这个图案(模式)中可以有多个限制点。
一个限制点是为模式匹配的从开始点出发的一条关系或一个节点。
可以通过id或索引查询绑定点。
通过id绑定点
通过node(*)函数绑定一个节点作为开始点
查询:
STARTn=node
(1)
RETURNn
返回引用的节点。
结果:
通过id绑定关系
可以通过relationship()函数绑定一个关系作为开始点。
也可以通过缩写rel()。
STARTr=relationship(0)
RETURNr
Id为0的关系将被返回
通过id绑定多个节点
选择多个节点可以通过逗号分开。
STARTn=node(1,2,3)
所有节点
得到所有节点可以通过星号(*),同样对于关系也适用。
STARTn=node(*)
这个查询将返回图中所有节点。
通过索引查询获取节点
如果开始节点可以通过索引查询得到,可以如此来写:
node:
index-name(key=”value”)。
在此列子中存在一个节点索引叫nodes。
STARTn=node:
nodes(name="
A"
索引中命名为A的节点将被返回。
通过索引查询获取关系
如果开始点可以通过索引查询得到,可以如此做:
Relationship:
STARTr=relationship:
rels(property="
some_value"
索引中属性名为”some_value”的关系将被返回。
多个开始点
有时需要绑定多个开始点。
只需要列出并以逗号分隔开。
STARTa=node
(1),b=node
(2)
RETURNa,b
A和B两个节点都将被返回。
Match
在一个查询的匹配(match)部分申明图形(模式)。
模式的申明导致一个或多个以逗号隔开的路径(path)。
节点标识符可以使用或者不是用圆括号。
使用圆括号与不使用圆括号完全对等,如:
MATCH(a)-->
(b)与MATCHa-->
b匹配模式完全相同。
模式的所有部分都直接或者间接地绑定到开始点上。
可选关系是一个可选描述模式的方法,但在真正图中可能没有匹配(节点可能没有或者没有此类关系时),将被估值为null。
与SQL中的外联结类似,如果Cypher发现一个或者多个匹配,将会全部返回。
如果没有匹配,Cypher将返回null。
如以下例子,b和p都是可选的病都可能包含null:
STARTa=node
(1)MATCHp=a-[?
]->
b
STARTa=node
(1)MATCHp=a-[*?
x-->
STARTa=node
(1),x=node(100)MATCHp=shortestPath(a-[*?
x)
相关节点
符号—意味着相关性,不需要关心方向和类型。
STARTn=node(3)
MATCH(n)--(x)
RETURNx
所有与A相关节点都被返回。
接出关系(Outgongrelationship)
当对关系的方向感兴趣时,可以使用-->
或<
--符号,如:
MATCH(n)-->
(x)
所有A的接出关系到达的节点将被返回.
定向关系和标识符
如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。
MATCH(n)-[r]->
()
所有从节点A接出的关系将被返回。
通过关系类型匹配
当已知关系类型并想通过关系类型匹配时,可以通过冒号详细描述。
MATCH(n)-[:
BLOCKS]->
返回A接出关系类型为BLOCKS的节点。
通过关系类型匹配和使用标识符
如果既想获得关系又要通过已知的关系类型,那就都添加上,如:
MATCH(n)-[r:
所有从A接出的关系为BLOCKS的关系都被返回。
带有特殊字符的关系类型
有时候数据库中有非字母字符类型,或有空格在内时,使用单引号。
TYPEWITHSPACEINIT]->
返回类型有空格的关系。
多重关系
关系可以通过使用在()—()多个语句来表达,或可以串在一起。
如下:
查询:
STARTa=node(3)
MATCH(a)-[:
KNOWS]->
(b)-[:
(c)
RETURNa,b,c
路径中的三个节点。
可变长度的关系
可变数量的关系->
节点可以使用-[:
TYPE*minHops..maxHops]->
STARTa=node(3),x=node(2,4)
MATCHa-[:
KNOWS*1..3]->
x
RETURNa,x
如果在1到3的关系中存在路径,将返回开始点和结束点。
在可变长度关系的关系标识符
当连接两个节点的长度是可变的不确定的时,可以使用一个关系标识符遍历所有关系。
MATCHa-[r:
零长度路径
当使用可变长度路径,可能其路径长度为0,这也就是说两个标识符指向的为同一个节点。
如果两点间的距离为0,可以确定这是同一个节点。
MATCHp1=a-[:
KNOWS*0..1]->
b,p2=b-[:
BLOCKS*0..1]->
c
RETURNa,b,c,length(p1),length(p2)
这个查询将返回四个路径,其中有些路径长度为0.
可选关系
如果关系为可选的,可以使用问号表示。
与SQL的外连接类似。
如果关系存在,将被返回。
如果不存在在其位置将以null代替。
STARTa=node
(2)
MATCHa-[?
返回一个节点和一个null,因为这个节点没有关系。
可选类型和命名关系
通过一个正常的关系,可以决定哪个标识符可以进入,那些关系类型是需要的。
MATCHa-[r?
:
LOVES]->
RETURNa,r
可选元素的属性
返回可选元素上的属性,null值将返回null。
RETURNx,x.name
元素x在查询中为null,所有其属性name为null。
复杂匹配
在Cypher中,可哟通过更多复杂模式来匹配,像一个钻石形状模式。
(c),(a)-[:
BLOCKS]-(d)-[:
KNOWS]-(c)
RETURNa,b,c,d
路径中的四个节点。
最短路径
使用shortestPath函数可以找出一条两个节点间的最短路径,如下。
STARTd=node
(1),e=node
(2)
MATCHp=shortestPath(d-[*..15]->
e)
RETURNp
这意味着:
找出两点间的一条最短路径,最大关系长度为15.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。
关系的字符描述像关系类型,最大数和方向在寻找最短路径中都将被用到。
也可以标识路径为可选。
所有最但路径
找出两节点节点所有的最短路径。
MATCHp=allShortestPaths(d-[*..15]->
这将在节点d与e中找到两条有方向的路径。
命名路径
如果想在模式图上的路径进行过滤或者返回此路径,可以使用命名路径(namedpath)。
MATCHp=a-->
开始节点的两个路径。
在绑定关系上的匹配
当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。
STARTa=node(3),b=node
(2)
KNOWS]-x-[?
KNOWS]-b
将返回两个连接节点,一次为开始节点,一次为结束节点。
Where
如果需要从查找的数据的图中过滤,可以在查询语句中添加where子句。
图:
Boolean操作类型
可以使用boolean操作符and和or或者也可以使用not()函数。
STARTn=node(3,1)
WHERE(n.age<
30andn.name="
Tobias"
)ornot(n.name="
返回节点。
节点属性上的过滤
WHEREn.age<
30
正则表达式
可以通过使用=~/regexp/来匹配正在表达式。
WHEREn.name=~/Tob.*/
返回名叫Tobias的节点。
转义正则表达式
如果在正则表达式中需要有斜杠时可以通过转义实现。
WHEREn.name=~/Some\/thing/
没有匹配的节点返回。
不分大小些正则表达式
在正则表达式前加上?
i,整个正则表达式将会忽略大小写。
WHEREn.name=~/(?
i)ANDR.*/
属性name为Andres的节点将返回
关系类型上的过滤
可以match模式中通过添加具体的关系类型,但有时需要针对类型的更加高级的过滤。
可以使用明确的type属性来对比,查询对关系类型名作一个正则比较。
WHEREtype(r)=~/K.*/
关系整个以K开始的类型名都将返回。
属性存在性
WHEREn.belt
如果缺失属性默认为true
仅当属性存在时,比较一个图的元素的此属性,使用允许空属性的语法。
WHEREn.belt?
='
white'
所有节点即使没有belt属性的都将返回。
此类比较返回为true。
如果缺失属性默认为false
需要在缺失属性时为false,即不想返回此属性不存在的节点时。
使用感叹号。
WHEREn.belt!
空置null过滤
有时候需要测试值或者标识符是否为null。
与sql类似使用isnull或not(isnullx)也能起作用。
STARTa=node
(1),b=node(3,2)
MATCHa<
-[r?
]-b
WHERErisnull
Tobias节点没有链接上。
关系过滤
为过滤两点间基于关系的子图,在match子句中使用限制部分。
可以描述带方向的关系和可能的类型。
这些都是有效的表达:
WHEREa-→bWHEREa←-bWHEREa←[:
KNOWS]-bWHEREa-[:
WHEREa<
--b
Tobias节点没有链接
neo4j综合
目录
1.返回节点
2.返回关系
3.返回属性
4.带特殊字符的标识符
5.列的别名
6.可选属性
7.特别的结果
查询中的返回部分,返回途中定义的感兴趣的部分。
可以为节点、关系或其上的属性。
图
返回节点
返回一个节点,在返回语句中列出即可。
STARTn=node
(2)
返回关系
返回属性
RETURNn.name
带特殊字符的标识符
使用不在英语字符表中的字符,可以使用’单引号。
START?
Thisisn'
tacommonidentifier=node
(1)
RETURN?
tacommonidentifier.<
<
!
__?
`
列的别名
可以给展示出来的列名起别名。
STARTa=node
(1)
RETURNa.ageASSomethingTotallyDifferent
返回节点的age属性,但重命名列名。
可选属性
属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可。
STARTn=node(1,2)
RETURNn.age?
如果存在age属性,则返回,不存在则返回null。
特别的结果
DISTINCT?
仅检索特别的行,基于选择输出的列。
(b)
RETURNdistinctb
返回name为B的节点,但仅为一次。
neo4j聚合函数
1.聚合Aggregation
1.计数
2.计算节点数
3.分组计算关系类型
4.计算实体数
5.计算非空可以值数
6.求和sum
7.平均值avg
8.最大值max
9.最小值min
10.聚类COLLECT
11.相异DISTINCT
聚合(Aggregation)
为集合计算数据,Cypher提供聚类功能,与SQL的groupby类似。
在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。
计数
计数(count)使用来计算行数。
Count有两种使用方法。
Count(*)计算匹配的行的行数,count(<
标识符>
)计算标识符中非空值数。
计算节点数
计算链接到一个节点的节点数,可以使用count(*)。
RETURNn,count(*)
返回开始节点和相关节点节点数。
分组计算关系类型
计算分组了得关系类型,返回关系类型并使用count(*)计算。
RETURNtype(r),count(*)
返回关系类型和其分组数。
计算实体数
相比使用count(*),可能计算标识符更实在。