我与分配到特定出租车的用户合作。每个用户都有一个网格目的地(下拉),例如
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
有什么建议吗? 提前谢谢
答案 0 :(得分:1)
为避免收到user_a
/ user_b
和user_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)
)。
另外,我不知道它是否会有所帮助,但你可能想要考虑一个类似于Reservation
或Pickup
的标签,这些标签可能有关系例如-[:MADE_BY]->(:User)
,-[:FULFILLED_BY]->(:Taxi)
,-[:DROPPED_OF_AT]->(:Grid)
。