Neo4j多关系或多路径
目录
一、双向关系
1.创建2个节点间的双向关系
2.创建多个路径的节点,双向关系
3.查询带有方向性的关系
4.查询路径上的多个关系
5.查询出a到b的最短距离
6.查询特定长度的路径
二、将之前的关系清空下,如图所示,在操作一次
1.查询出a到b的最短距离
编辑 2.查询路径上的多个关系
3.查询特定长度的路径
一、双向关系
1.创建2个节点间的双向关系
CREATE (a:Person {name: 'Alice'})-[r1:KNOWS]->(b:Person {name: 'Bob'})
CREATE (b)-[r2:KNOWS_BACK]->(a)
return r1,r2

2.创建多个路径的节点,双向关系
CREATE (a:xiyou {name: '唐僧'})-[r1:师父]->(b:xiyou {name: '孙悟空'})
CREATE (c:xiyou {name: '猪八戒'})-[r2:老家]->(d:xiyou {name: '高老庄'})
CREATE (e:xiyou {name: '老高'})-[r3:老爸]->(f:xiyou {name: '高圆圆'})
CREATE (b)-[r4:徒弟]->(a)
CREATE (a)-[r5:师父]->(c)
CREATE (a) <-[r6:徒弟]-(c)
CREATE (c) <-[r7:上门女婿]-(d)
CREATE (d)-[r8:出生地]->(e)
CREATE (d) <-[r9:村长]-(e)
CREATE (e) <-[r10:女儿]-(f)
return r1,r2,r3,r4,r5,r6,r7,r8,r9,r10

3.查询带有方向性的关系
查询带有方向性的关系时,你需要指定关系的方向。这可以通过在关系类型前加上
->或<-来实现
match(q:xiyou) -[r:师父]->(b:xiyou) return q,b

MATCH关键字用于匹配模式。(q:xiyou) -[r:师父]->(b:xiyou)匹配所有从xiyou类型的节点 r通过师父关系指向xiyou类型的节点b的模式。return q,b;返回匹配到的节点q和b,以及关系r。
4.查询路径上的多个关系
MATCH (a:xiyou)-[:村长*]->(b:xiyou)
WITH a, b,(a)-[:村长*]->(b) AS path
RETURN a, b, LENGTH(path) AS distance;

- 在
WITH子句中,你需要明确地计算出从a到b的路径(即(a)-[:村长*]->(b))。 LENGTH(path)现在作用于path,计算的是该路径中的关系数。
解释:
(a)-[:村长*]->(b)是路径表达式,表示从a到b的路径,可以有多个村长关系。LENGTH(path)计算路径中的关系数量,作为节点之间的“距离”

LENGTH应该作用于一个路径,而不是节点和关系的组合。你可以使用MATCH查找路径并在RETURN中计算该路径的长度。换成如下写法:
MATCH (a:xiyou)-[:村长*]->(b:xiyou)
WITH a, b, relationships((a)-[:村长*]->(b)) AS path
RETURN a, b, LENGTH(path) AS distance
解释:
- 路径表示:使用
relationships()来获取从节点a到b的所有关系,这样就能确保你得到了一个路径(path)。- 计算路径长度:
LENGTH(path)计算路径中的关系数量,也就是节点之间的“距离”。WITH子句:中间步骤使用WITH来传递变量a,b和路径path,并计算出路径的长度distance。但是报错,这里不适合用relationships()
如果不考虑所有的路径,而是想要获取最短路径的距离,你可以使用 shortestPath()
5.查询出a到b的最短距离
MATCH (a:xiyou)-[:村长*]->(b:xiyou)
with shortestpath((a)-[:村长*]->(b)) AS path
RETURN LENGTH(path) AS distance;

6.查询特定长度的路径
MATCH p = (a:xiyou)-[:村长*1..3]->(b:xiyou)
WHERE a.name = '老高'
RETURN p, LENGTH(p) AS length;

[:村长*1..3]表示匹配长度为1到3的KNOWS关系链。p = ...将整个路径作为一个变量p返回。LENGTH(p)计算路径的长度。
二、将之前的关系清空下,如图所示,在操作一次

1.查询出a到b的最短距离
2.查询路径上的多个关系

3.查询特定长度的路径
或【1..4】

