Neo4j仅当where子句总是为真时才返回一个节点

考虑下面的Neo4j数据库例子:

节点是(篮子)(预订)和[:IS_BOOKED_IN]

现在预订看起来像这样: Booking {start:number,end:number}

如果您预定了某个东西,您可以select要预订哪个篮子,并在这两者之间创build关系[:IS_BOOKED_IN]。

这工作得很好。

现在我想检查我的下一个预订,如果任何篮子可用的时间框架,我select。

现在我正在用Cypher来做这个查询:

MATCH(basket:Basket) – [:IS_BOOKED_IN] – >(booking:Booking)WHERE({start} <booking.start AND {end} <booking.start)OR({end}> booking.end AND {start}> booking.end)返回篮子

{开始}和{结束}是数字

正如你所看到的,这将会像预期的那样工作,但前提是只有一个预订。 只要有更多的预订,我会得到相同的篮子,即使它显然不可用,从而使我的查询无用。

发生这种情况是因为在WHERE子句失败时查询不会停止,而是再次使用相同的Basket节点,并检查其他预订,这些预订不会失败,然后将我退还给篮子。

我怎么能改变这个,如果WHERE子句总是正确的,我怎么能告诉Neo4j只返回篮子给我? 或者只是一次失败就跳过篮子。

任何想法表示赞赏,谢谢

你可以使用一个集合,即collect ,然后是ALL谓词。

 MATCH (basket:Basket)-[:IS_BOOKED_IN]->(booking:Booking) WITH basket, collect(booking) as bookings WHERE ALL(booking in bookings WHERE ({start} < booking.start AND {end} < booking.start) OR ({end} > booking.end AND {start} > booking.end)) RETURN basket 

我认为你正在寻找CASEexpression式, 请参阅Neo4j文档

只有符合您的要求的情况下,才可以使用返回结果。

例:

 MATCH (u:User) WHERE u.name = "foo" RETURN CASE when u.age > 18 THEN u ELSE null END as result 

另一种解决办法是在你的WHERE子句中将“AND”改为“AND”,只有满足这两个条件时才会得到结果。