Neo4j / Cypher:如果另一个节点之间的任何关系符合某个标准,则返回节点

时间:2017-10-13 15:46:31

标签: neo4j cypher

有2个节点

  1. 路线图:(:路线图)
  2. 计划:(:计划)
  3. 他们与这种关系有关 (:Roadmap)<-[:IS_SHOWN_ON_ROADMAP]-(:Program)

    每次从路线图中删除某个程序时,都会在该关系上设置endDate属性。如果将相同的程序添加回同一路线图,则会添加新的关系,而不会添加endDate属性。 (这样我们就可以回到过去,看看过去的状况)。

    因此,任何两个[:IS_SHOWN_ON_ROADMAP](:Program)节点之间可能存在任意数量的(:Roadmap)关系。如果存在n个关系,则n或n中的1个将具有结束日期。所有人都有一个结束日期,因为该计划当前不在路线图上,或者如果当前在路线图上,其中一个将没有endDate。

    所以我的问题:在cypher中,我如何提出问题&#34;向我展示路线图中目前尚未激活的所有程序?&#34;

    AKA,如果至少有一个与endDate的关系为空,则不要将其返回。
    或者:仅返回所有关系都有endDate的程序

    我的查询(不是很有效)是

    MATCH (rm:Roadmap)<-[r:IS_SHOWN_ON_ROADMAP]-(p:Program)
    WHERE r.endDate IS NOT NULL
    RETURN p
    

    此查询仍将返回路线图中处于活动状态的程序(如果已在过去的某个时间删除)。

    示例:如果有两种关系,一种是endDate(因为它已被删除),另一种没有endDate(因为它目前与路线图相关联)。

    我需要在cypher中找出一种方法来循环遍历每个程序和路线图之间的所有关系,如果至少有一个关系没有结束日期,则不返回该程序。

1 个答案:

答案 0 :(得分:2)

您可以尝试使用ALL功能:

MATCH (rm:Roadmap)<-[r:IS_SHOWN_ON_ROADMAP]-(p:Program)
WITH p, collect(r) as rs WHERE ALL(rel in rs WHERE rel.endDate IS NOT NULL)
RETURN p