如何使用Cypher在具有多个路径时执行不同的操作

时间:2015-11-11 13:36:18

标签: neo4j cypher

对于给定节点(sourceNode),我想检索在3跳内与sourceNode有关系的所有节点。

当我们有源节点和目标节点有多个路径时,问题就开始了。

我不关心我得到的路径,只要我得到一条而且我不想得到其他路径(只有最短路径才会很棒)

所以这是我的代码:

MATCH (user:C9 {userId:'70'})-[r:follow*1..3]-f WHERE f <> user 
RETURN DISTINCT (f.userId) as userId, 
reduce(s = '', rel IN r | s + rel.dist + ',') as dist,
length(r) as hop

对此的休息包含相同的nodeId(userId&#39; s)且不执行不同的操作:

result from neo4j

我想避免使用相同userId的重复行。

任何想法如何在这里执行不同的?

谢谢, 射线。

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样?而不是寻找不同的用户,只需使用 shortestPath 就可以从初始用户那里获得每个关注者1..3。

MATCH p=shortestPath((user:C9 {userId:'70'})-[r:follow*1..3]-(f)) 
WHERE f <> user 
RETURN f.userId, 
reduce(s = '', rel IN r | s + rel.dist + ',') as dist,
length(p) as hop

或者,如果您希望通过最短的距离进行操作而不管跳跃,您可以执行类似以下示例的操作。而不是使用shortestPath,聚合每个关系的距离,按最短的顺序排列,将它们放在一个集合中,按用户排序并返回最短的集合的第一个元素

MATCH p=(user:C9 {userId:'70'})-[r:follow*1..3]-(f)
WHERE f <> user 
with f.userId as user_id
, reduce(s = 0, rel IN relationships(p) | s + rel.dist) as dist
, length(p) as hops
order by dist
with user_id, collect(dist) as dists_per_follow, collect(hops) as hops_per_follow
return user_id
, dists_per_follow[0] as shortest
, dists_per_follow, hops_per_follow
order by user_id