模式和模式匹配是Cypher的核心,使用模式来描述所需数据的形状,该模式使用属性图的结构来描述,一般使用小括号()表示节点,-->表示关系,-[]->表示关系和关系的类型,箭头表示关系的方向。html
用小括号表示节点模式:(a),
a是节点变量的名称,用于引用图中的某一个节点a。spa
对于匿名的节点,能够使用()来表示,匿名的节点没法引用,一般用来表示路径中的占位节点。code
1,标签模式htm
在节点变量的后面,使用 :Lable 来表示标签,标签是节点的分组,一个节点能够有一个标签,也能够有多个标签,blog
好比,(a:User),(a:User:Admin)
ip
2,指定属性rem
节点和关系都有属性,属性模式能够使用Map结构来表示,属性模式的格式是{ key:value,..},使用大括号表示一个字典,包含一个或多个键/值对:文档
(a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'}) (a)-[{blocked: false}]->(b)
关系模式是由节点和路径来描述的,最简单的关系模式两个节点和一个路径:it
(a)--(b)
该模式表示节点a和节点b之间存在关系,不指定关系的方向。class
1,关系的名称和方向
关系也能够被命名,Cypher使用[r]来表示关系变量:
(a)-[r]-(b)
关系是有方向的,使用箭头指定关系的方向:
(a)-[r]->(b)
注意:图中关系的方向是在建立关系时指定的,在执行Cypher查询时,若是指定关系的方向,那么沿着关系的方向进行模式匹配。
2,关系类型
就像节点具备标签,能够对节点进行分组,关系也能够分组,Neo4j按照关系的类型对关系进行分组
(a)-[r:REL_TYPE]->(b)
可是不像节点能够有多个标签,关系只能由一个关系类型,可是,关系的类型能够属于一个集合,这使用 | 来分割,表示关系输入集合中的任意一个类型:
(a)-[r:TYPE1|TYPE2]->(b)
路径是由节点和关系构成的序列,在路径中节点和关系是交替相连的,不可中断。路径的长度是指关系的数量,固定长度的路径是指:路径中关系的数量是固定不变的,可变长度的路径是:指路径中关系的数量是可变的。关系的数量有两种表示方式:固定长度和变长。
注:start和end均可以省略,若是省略start,那么关系的长度 <= end;若是省略end,那么关系的长度>=start;若是同时省略start和end,那么关系的长度是任意的。
在变长关系模式中,也能够指定关系的类型:[Type * start .. end ],变长关系只能用于MATCH查询语句中,不能用于CREATE和MERGE语句中。
1,固定长度的关系
在关系[]中,使用*2表示关系的长度为2,使用该模式来表示路径,路径两端的节点是a和b,路径中间的节点是匿名的,没法经过变量来引用。
(a)-[*2]->(b)
该模式描述了3个节点和2个关系,路径两端的节点是a和b,中间节点是匿名节点,等价于如下的模式:
(a)-->()-->(b)
2,变长关系
在关系[]中,使用[*start .. end]来表示变长关系
(a)-[*3..5]->(b) (a)-[*3..]->(b) (a)-[*..5]->(b) (a)-[*]->(b)
3,路径变量
Cypher容许对Path命名,把Path赋值给变量p,路径模式能够使用p来表示:
p = (a)-[*3..5]->(b)
4,举个例子
有以下的有向图数据,按照有向图来计算路径,最长的路径长度是2;按照无向图来计算路径,最长的路径长度是6。
分析如下Cypher查询,在路径模式中,路径是无向的,路径的长度是1或2,关系的类型是KNOWS,节点Filipa和节点remote_friend在同一条路径中,
MATCH (me)-[:KNOWS*1..2]-(remote_friend) WHERE me.name = 'Filipa' RETURN remote_friend.name
参考文档:
原文出处:https://www.cnblogs.com/ljhdo/p/10913917.html