节点模式
- 查询跟孙悟空有关系的所有节点
match(a:X_Person) -- (b) where a.name = '孙悟空' return a,b
或者
match(a:X_Person{name:'孙悟空'}) -- (b) return a,b
查询说明:
上述的查询用到了 节点的模式。
(b):节点的变量名是b,后续可以给查询语句续用;后面没带:和标签,代表是匿名模式,可以是任何的节点。
(a:X_Person):属于 (n:label)模式,a 是变量名,后面的 where 和 return 可以用到。 X_Person 是指定的节点的标签;
(a:X_Person{name:‘孙悟空’}):这种模式可以描述节点的属性,可以是多个。这个语句里属性 name, 并且 name 的值是"孙悟空",等同于上面语句的 where a.name = ‘孙悟空’。
关系模式
- 上述语句查询的是跟孙悟空有 relative 关系的所有节点
match(a:X_Person{name:'孙悟空'}) -[r:relative]- (b) return a,b
- 查询孙悟空偷吃过的节点实体
match(a:X_Person{name:'孙悟空'}) -[r:relative{role:'偷吃'}]- (b) return a,b
在属性图中,节点之间存在关系,[]表示关系,节点之间的关系用 ()-[]->() 表示。
- [ r ] :r 是关系的变量名,[] 表示匿名;
- [ r: relatvie ]:relatvie 表示关系的类型,一个关系只有一个类型;
- [ r: relative{role:‘偷吃’}] :role 表示 relative 的属性,并且他的值是“偷吃”
关系的方向
- 节点与节点间关系的关联模式
关系是有方向的,-- 是表示不指定方向, --> 表示指定方向的。
比如
match(a:X_Person{name:'孙悟空'}) <-[r:relative]- (b) return a,b
match(a:X_Person{name:'孙悟空'}) -[r:relative]-> (b) return a,b
match(a:X_Person{name:'孙悟空'}) <-[r:relative]-> (b) return a,b
关系变长查询
节点和节点通过关系进行连接。 通过节点的指定路径查询指定节点,就需要遍历了。
- (a)–>(b) 是步长为 1 的路径 ,ab 节点之前有直接关系。像我们上面的查询,基本就都是有直接关系的。
- (a)–>()–>(b) 是步长为 2 的路径,ab 之间有一个节点,两个关系。
步长的长度也在Cypher语音里也支持指定变长,通过 [*N…M] 来表示,N 代表最小值, M 代表最大值。
- (a)-[*2]->(b):表示路径长度为2,起始节点是a,终止节点是b;
- (a)-[*3…5]->(b):表示路径长度的最小值是3,最大值是5,起始节点是a,终止节点是b;
- (a)-[*…5]->(b):表示路径长度的最大值是5,起始节点是a,终止节点是b;
- (a)-[*3…]->(b):表示路径长度的最小值是3,起始节点是a,终止节点是b;
- (a)-[*]->(b):表示不限制路径长度,起始节点是a,终止节点是b;
比如查询,和孙悟空有2-5步长关系的节点。
match(a:X_Person{name:'孙悟空'}) -[*2..5]-> (b) return a,b
这里要注意 -> 加上了箭头后,就是有指定方向的,如果中间也反向的,那么也不算的。
这里为什么出现了,沙悟净,因为,沙悟净和孙悟空之间也隔了一个猪八戒,刚好满足条件。