对于给定节点(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)且不执行不同的操作:
我想避免使用相同userId的重复行。
任何想法如何在这里执行不同的?
谢谢, 射线。
答案 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