2016-01-06 23 views
0

是一个简单的查询,但我不知道哪个密码操作或java集合将有助于获得预期的结果。cypher返回节点位于相同的地方

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

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

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号码的用户。

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

预先感谢您

回答

1

您可以使用集合暗号的内置聚合函数,如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] 

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

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

  • 查询将是低效的,因为你可能需要同时匹配日期和时间字符串属性
  • 它不允许匹配落客时间,这是接近

我建议你造型的落客时刻作为树。请参阅以下链接以供参考:

+0

它的工作原理。谢谢你的建议。我要做一些改变 – andreahg

1

//只是用我上面的答案 也Neo4j的具有使用收集选项所以结果返回列表中。

匹配(N) - [] - >(R) 回报N,收集(R)作为集

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

我想你应该更改日期时间。不在字符串中,但更像yyyyMMddhhmmss,因此您可以比较。或者任何其他方式。

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

+0

谢谢@Mvde的建议。 – andreahg

+0

欢迎您也可以考虑另外构建数据。 因为现在你的用户是在网格和出租车之间,所以没有办法告诉那个用户使用哪个出租车。如果您有多个连接到同一个用户的下拉菜单。或者你的用户只是一个节点。它会花费一些时间绘制一些图形 – Mvde

+0

用户只是一个节点,它有一个dropOff位置(Grid)和一个指定的出租车。到目前为止,我只是将用户分配给Taxi(:User) - [:ASSIGNED] - >(:Taxi)的关系,而不是其他用户。 – andreahg

相关问题