考虑以下Neo4j数据库示例:
节点是(篮子)(预订)和[:IS_BOOKED_IN]
现在预订如下所示:预订{start:number,end:number}
如果您预订了一些内容,您可以选择要预订哪个篮子,并在这两个篮子之间创建关系[:IS_BOOKED_IN]。
这完全正常。
现在,如果我选择的时间范围内有任何购物篮,我想查看下次预订。
现在我正在使用此查询在Cypher中执行此操作:
MATCH(购物篮:购物篮) - [:IS_BOOKED_IN] - >(预订:预订) WHERE({start}< booking.start AND {end}< booking.start) 或({end}> booking.end AND {start}> booking.end) 返回篮子
{start}和{end}是数字
正如您所看到的,这将按预期工作,但仅限于只有一个预订。一旦有更多的预订,我会得到同样的篮子,即使它显然不可用,因此使我的查询无用。
这是因为当WHERE子句失败时查询没有停止,而是再次获取相同的Basket节点并检查其他预订,这些预订不会失败,反过来又会让我回到篮子里。
如何改变这一点,如果WHERE子句始终为真,我如何告诉Neo4j只将篮子归还给我?或者只是跳过篮子,如果它只失一次......
任何想法都表示赞赏,谢谢
答案 0 :(得分:2)
您可以使用集合,即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
答案 1 :(得分:0)
我认为您正在寻找CASE表达式see Neo4j documentation
只有在满足您的要求时才能使用大小写返回结果。
示例:
MATCH (u:User) WHERE u.name = "foo"
RETURN CASE when u.age > 18 THEN u ELSE null END as result
另一个解决方案是在WHERE子句中为“AND”更改“OR”,然后仅在满足这两个条件时才会获得结果。