Neo4j/密码 : Return node if any of the relationships between it an another node meet a certain criteria

标签 neo4j cypher

有2个节点

  1. 路线图:(:路线图)
  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/

相关文章:

java - Neo4j - 按相关性排序

neo4j - Cypher COLLECT 使 UNWIND 以错误的顺序展开

Neo4j 2 和 Java 8

neo4j - 更新至: Adding node to Neo4j Spatial Index

neo4j - 如何在 cypher 中检查节点的类型?

neo4j - Gremlin 中是否可以计算树形图之间的差异?

json - neo4j 浏览器导出文件,包括关系

ruby-on-rails - Neo4j gem - 处理管理关系的首选方法

r - 将批量节点与属性合并时的重复

date - 将日期与 Spring Data neo4j 进行比较