Neo4j Return 仅当 where 子句始终为真时才为节点

Neo4j Return a node only if where clause is always true

考虑以下 Neo4j 数据库示例:

节点是(Basket)(Booking)和[:IS_BOOKED_IN]

现在预订看起来像这样:预订{开始:数字,结束:数字}

如果您预订某样东西,您可以选择使用哪个篮子进行预订,然后在这两者之间创建关系 [: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) RETURN basket

{start}和{end}是数字

如您所见,这将按预期工作,但前提是只有一个预订。一旦有更多的预订,我就会得到同样的篮子,即使它显然不可用,从而使我的查询无用。

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

如何更改此设置,如果 WHERE 子句始终为真,我如何告诉 Neo4j 只 return 篮子给我?或者如果只失败一次就跳过篮子..

任何想法表示赞赏,谢谢

我认为您正在寻找 CASE 表达式 see Neo4j documentation

大小写可以用来return结果只有满足你的要求。

示例:

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

另一种解决方法是在你的WHERE子句中将"OR"改为"AND",这样只有满足两个条件才会取结果。

您可以使用集合,即 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