Neo4j 来自一组节点的密码返回一定距离内的节点

Neo4j 来自一组节点的密码返回一定距离内的节点,neo4j,cypher,Neo4j,Cypher,我正在与分配给特定出租车的用户合作。每个用户都有一个网格目的地(下车),例如 我想返回在一定时间内彼此关系密切(朋友的朋友)的用户 为此,我需要查看每个网格之间的时间是否小于n值。每个网格之间的关系如下所示: (:Grid)-[:TO {time:3}]-(:Grid) 因此,从返回的网格组中,我想检查其中哪些网格彼此接近 Grid1347是否靠近G1239?,G1347是否靠近G811?。。。G1239是否接近G1347?。。。等等 如果我运行此查询,将获取分配给特定:Taxi的[:到*1.

我正在与分配给特定出租车的用户合作。每个用户都有一个网格目的地(下车),例如

我想返回在一定时间内彼此关系密切(朋友的朋友)的用户

为此,我需要查看每个网格之间的时间是否小于n值。每个网格之间的关系如下所示:

(:Grid)-[:TO {time:3}]-(:Grid)
因此,从返回的网格组中,我想检查其中哪些网格彼此接近

Grid1347是否靠近G1239?,G1347是否靠近G811?。。。G1239是否接近G1347?。。。等等

如果我运行此查询,将获取分配给特定:Taxi的[:到*1..2]范围内的用户和网格

但我认为,这不是最优的,因为我得到了重复的值(网格和用户)

对于上一个查询,我的第一个想法是这个查询,但我没有得到任何结果

MATCH
  (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]->
  (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->
  (t:Taxi {name:'Taxi1813'})
WITH g2, g
MATCH p=shortestPath((g2)-[r:TO]-(g))
WITH p,
REDUCE(totalTime = 0, x IN RELATIONSHIPS(p) | totalTime + x.time) AS totalTime
RETURN totalTime
匹配
(t:Taxi{名称:'Taxi1813'})
(g2:网格)-[:到*1..2](g:网格)
(t:Taxi{名称:'Taxi1813'})
用g2,g
匹配p=最短路径((g2)-[r:TO]-(g))
有了p,
将(totalTime=0,关系中的x(p)| totalTime+x.time)减少为totalTime
返回总时间
有什么建议吗?
提前谢谢你

为了避免像
user\u a
/
user\u b
user\u b
/
user\u a
这样的重复,你可以添加一个
其中ID(u)
,以确保每对只获得一次:

MATCH
  (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]->
  (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->(t)
WHERE ID(u) < ID(u2)
RETURN u.name, g.name, u2.name, g2.name
匹配
(t:Taxi{名称:'Taxi1813'})
(g2:网格)-[:到*1..2](g:网格)(t)
其中ID(u)
根据您所在的领域,对网格执行此操作是有意义的(例如,
其中ID(g)


单独,我不知道它会不会有帮助,但是你可能会考虑有一个标签,它是沿着<代码>保留> <代码>或代码>拾取< /代码>,它可能有关系,如“代码> -[:MadiyBu] ->((用户))/>代码>代码> >(::出租车)<代码> >代码> -[-DopPosioOfAT] ->(:网格)

谢谢@BrianUnderwood,我尝试了你的建议。首先是用户条件ID(u),是的,一旦你建议我添加新标签,我真的很想,但问题是我们要合并两个算法,而另一个学生已经定义了标签并开发了一个算法。因此,现在不可能进行更改:(因为我们已经没有时间了。谢谢你的建议,我希望我们以后不会遇到问题。一个节点可以有多个标签。因此,可能已经可以合并这两个算法。我尝试了这个方法,似乎效果不错……我添加了一个不同的匹配项(t:Taxi{name:'Taxi1813})(g2:Grid)-[r:TO*1..2]-(g:Grid)(t)其中ID(u2)MATCH (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]-> (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]-> (t:Taxi {name:'Taxi1813'}) RETURN u.name, g.name, u2.name, g2.name
u.name  g.name      u2.name g2.name
User183 Grid1347    User177 Grid1239
User177 Grid1239    User183 Grid1347
User177 Grid1239    User179 Grid1184
User177 Grid1239    User179 Grid1184
User179 Grid1184    User177 Grid1239
User179 Grid1184    User177 Grid1239
MATCH
  (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]->
  (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->
  (t:Taxi {name:'Taxi1813'})
WITH g2, g
MATCH p=shortestPath((g2)-[r:TO]-(g))
WITH p,
REDUCE(totalTime = 0, x IN RELATIONSHIPS(p) | totalTime + x.time) AS totalTime
RETURN totalTime
MATCH
  (t:Taxi {name:'Taxi1813'})<-[:ASSIGNED]-(u2:User)-[:DROP_OFF]->
  (g2:Grid)-[:TO*1..2]-(g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->(t)
WHERE ID(u) < ID(u2)
RETURN u.name, g.name, u2.name, g2.name