在neo4j的Kevin路径

时间:2016-01-07 01:47:30

标签: neo4j

我试图发现我要用Cipher认识一个朋友需要做多少次跳跃。我有这些关系。

(Gutierrez)-[:Conhece]->(Felipe),
(Felipe)-[:Conhece]->(Gutierrez),
(Felipe)-[:Conhece]->(Fernando),
(Fernando)-[:Conhece]->(Felipe),
(Fernando)-[:Conhece]->(Pedro),
(Pedro)-[:Conhece]->(Fernando),
(Pedro)-[:Conhece]->(Arthur),
(Arthur)-[:Conhece]->(Pedro),
(Arthur)-[:Conhece]->(Vitor),
(Vitor)-[:Conhece]->(Arthur),

当我执行我的查询时,它显示了费尔南多。我想要的只是展示Vitor,Pedro和Arthur。

MATCH (n:Leitor)-[r:Conhece]-m
WHERE n.nome='Pedro' OR m.nome='Vitor'
RETURN n,r,m

enter image description here

使用我的培根路径查询 - > enter image description here

2 个答案:

答案 0 :(得分:0)

你走了:

MATCH shortestPath((n:Leitor)-[rels:Conhece*]-m)
WHERE n.nome IN ['Pedro', 'Vitor']
RETURN n,rels,m,length(rels)

在这种情况下,rels将是关系的集合,因为路径是可变长度的。你也可以这样做:

MATCH path=shortestPath((n:Leitor)-[rels:Conhece*]-m)
WHERE n.nome IN ['Pedro', 'Vitor']
RETURN n,rels,m,length(rels),path,length(path)

答案 1 :(得分:0)

好的,我正在添加另一个答案,因为我觉得我理解你想要什么,而且与我的其他答案不同。

如果你想找到Pedro和Vitor都遇到的每个人(在这种情况下,只是作者):

MATCH (pedro:Leitor)-[:Conhece]-(in_common:Leitor)-[:Conhece]-(vitor:Leitor)
WHERE pedro.nome='Pedro' AND vitor.nome='Vitor'
RETURN in_common

这也可能看起来好一点:

MATCH (pedro:Leitor {nome: 'Pedro'})-[:Conhece]-(in_common:Leitor)-[:Conhece]-(vitor:Leitor {name: 'Vitor'})
RETURN in_common

我还从截图中注意到,每次会议都有两种关系。这可能就是你想要的,但是如果你的计划是每当两个人见面时总是有两个关系,那么你就可以通过一种关系逃脱。当您双向查询时(也就是说,没有像上面的查询中那样指定方向),那么您将获得任意方向的关系。

通常情况下,如果方向很重要,您只希望双向关系。这可能是因为你只记录它从一个节点到另一个节点,或者可能是因为你在关系中存储了不同的值。