有2个节点
- 路线图:(:路线图)
- 程序:(:程序)
他们与关系有关
(:Roadmap)<-[:IS_SHOWN_ON_ROADMAP]-(:Program)
每次程序从路线图中删除时,都会出现 endDate
属性在关系上设置。如果相同的程序被添加回相同的路线图,则会添加新的关系,而无需 endDate
属性(property)。 (这样我们就可以回到过去并看到过去事物的状态)。
因此可能有任意数量的 [:IS_SHOWN_ON_ROADMAP]
任意两个之间的关系(:Program)
和(:Roadmap)
节点。如果有 n 个关系,则其中 n 或 n - 1 个将有结束日期。如果该计划当前不在路线图上,则所有项目都会有结束日期,或者其中一个项目如果当前在路线图上,则不会有结束日期。
所以我的问题:在 cypher 中,我如何提出问题“显示路线图中当前未激活的所有程序?”
又名,如果至少有一个与 endDate
的关系如果为 null,则不要返回它。
或者:仅返回所有关系都有结束日期的程序
我的查询(不太有效)是
MATCH (rm:Roadmap)<-[r:IS_SHOWN_ON_ROADMAP]-(p:Program)
WHERE r.endDate IS NOT NULL
RETURN p
如果该程序在过去某个时间被删除,则此查询仍将返回路线图上处于事件状态的程序。
示例:如果有两个关系,其中一个关系为 endDate
(因为它已被删除)和一个没有 endDate
的(因为它当前与路线图相关联)。
我需要在 cypher 中找出一种方法来循环每个程序和路线图之间的所有关系,并且如果至少其中一个关系没有结束日期,则不返回该程序。
最佳答案
您可以尝试使用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
关于Neo4j/密码 : Return node if any of the relationships between it an another node meet a certain criteria,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46733589/