Neo4j仅当where子句始终为true时才返回节点

时间:2015-08-30 14:27:37

标签: javascript node.js neo4j cypher nodes

考虑以下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只将篮子归还给我?或者只是跳过篮子,如果它只失一次......

任何想法都表示赞赏,谢谢

2 个答案:

答案 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”,然后仅在满足这两个条件时才会获得结果。