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

时间:2016-01-05 11:36:12

标签: neo4j cypher

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

MATCH (g:Grid)<-[rp:DROP_OFF]-(u:User)-[:ASSIGNED]->(t:Taxi {name:'Taxi1813'})
RETURN g.name as gridName, rp.time as dropTime, u.name as userName

这是结果

   gridName  dropTime userName
   Grid1347  04:44    User183
   Grid1239  04:38    User177
   Grid811   04:44    User198
   Grid765   04:45    User197
   Grid1184  04:41    User179
   Grid333   04:45    User186

我想在一定时间内回复彼此接近的用户(朋友的朋友)。

为此,我需要查看每个网格之间的时间是否小于 n 值。例如,每个网格的关系就是这样。

(:Grid)-[:TO {time:3}]-(:Grid)

因此,从返回的网格组中,我想检查它们中的哪一个是彼此接近的

是Grid1347接近G1239 ?, G1347接近G811?...是G1239接近G1347?...等等......等等

如果我运行此查询,以获取分配给特定:Taxi

的范围[:TO * 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'})
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

有什么建议吗? 提前谢谢

1 个答案:

答案 0 :(得分:1)

为避免收到user_a / user_buser_b / user_a等重复项,您可以添加WHERE ID(u) < 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)
WHERE ID(u) < ID(u2)
RETURN u.name, g.name, u2.name, g2.name

根据您的域名,对网格而言也是有意义的(例如WHERE ID(g) < ID(g2))。

另外,我不知道它是否会有所帮助,但你可能想要考虑一个类似于ReservationPickup的标签,这些标签可能有关系例如-[:MADE_BY]->(:User)-[:FULFILLED_BY]->(:Taxi)-[:DROPPED_OF_AT]->(:Grid)