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”,只有满足这两个条件时才会得到结果。