cypher返回位于同一位置

时间:2016-01-06 10:59:25

标签: neo4j cypher

是一个简单的查询,但我不知道哪个cypher操作或java集合对于获得预期结果很有用。

因此,再次与分配到特定出租车的用户合作,每个用户都有一个网格目的地(下车)。

首先,我返回分配给特定出租车的用户和相同的dropOff时间:

MATCH (g:Grid)<-[d:DROP_OFF]-(u:User)-[rt:ASSIGNED]->(t:Taxi {name: 'Taxi1813'})
WHERE d.time = '04:38' 
RETURN u.name, g.name as LocationGrid

u.name           LocationGrid
UserTestSame     Grid1239
UserTestNew      Grid919
User177          Grid1239

我想添加一个条件来返回位于同一网格中的用户。结果集不固定;我可能有 n 数字f用户。

是否有一种简单的方法可以做到这一点,或者我应该使用java中的集合来比较每个网格。

提前谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用聚合Cypher的内置聚合函数,例如collect

MATCH (g:Grid)<-[d:DROP_OFF]-(u:User)-[rt:ASSIGNED]->(t:Taxi {name: 'Taxi1813'})
WHERE d.time = '04:38' 
RETURN g.name as LocationGrid, collect (u.name) as users

LocationGrid    users
Grid1239        [UserTestSame, User177]
Grid919         [UserTestNew]

您的查询假定分配到同一出租车的用户具有相同的下车时间?似乎让我感到困惑,但我可能会遗漏一些东西。

顺便说一句,我不认为存储和匹配下拉时间作为字符串将非常适合以下原因:

  • 查询效率低下,因为您可能需要匹配日期和时间字符串属性
  • 它不允许匹配关闭的下拉时间

我建议将下拉时间建模为时间树。请参阅以下链接以供参考:

答案 1 :(得分:1)

//只需使用我上面的答案 此外,Neo4j可以选择使用收集,以便结果返回列表中。

匹配(N) - [] - &GT;(r)的 return n,collect(r)as collection

http://neo4j.com/docs/stable/query-aggregation.html#aggregation-collect

我认为你应该改变你的约会时间。不是字符串,而是更像yyyyMMddhhmmss,所以你可以比较。或任何其他方式。

将它存储为字符串也会更快。