【问题标题】:Neo4j Return Top Level Nodes in TreeNeo4j 返回树中的顶级节点
【发布时间】:2015-05-22 19:39:41
【问题描述】:

我在 Neo4j 中有以下数据:

CREATE (t1:T {start:1, end:8})
CREATE (t2:T {start:1, end:4})
CREATE (t3:T {start:1, end:2})
CREATE (t4:T {start:3, end:4})
CREATE (t5:T {start:5, end:6})
CREATE (t6:T {start:7, end:8})
CREATE (t2)-[r1:T_OF]->(t1)
CREATE (t3)-[r2:T_OF]->(t2)
CREATE (t4)-[r3:T_OF]->(t2)
CREATE (t5)-[r4:T_OF]->(t1)
CREATE (t6)-[r5:T_OF]->(t1)

这将创建一个具有开始值和结束值的树,在我的实际应用程序中它们是纪元日期。我希望能够找到在给定范围内没有附加更短/更小节点的节点。

MATCH (t:T)
WHERE t.start >= 1 AND t.end <= 6
(MAGIC)
RETURN t

我的目标是只返回t2t5,即使t3t4 属于该范围。由于它们与t2 具有T_OF 关系,因此应忽略它们。

我尝试了几种不同的方法,但不幸的是我无法弄清楚这一点。

如果我应该更好地解释,请告诉我。

【问题讨论】:

  • “更短/更小的节点”是什么意思,T_OF 关系的重要性是什么?
  • 在实际应用中,这些是一个学年的条款。你有最高学期,学年,以及第 1 学期和第 2 学期的子学期,还​​有更小的学期 1-4,甚至更小的学期与季度。例如,这个想法是返回一个范围内的术语,而不包括子术语。例如,获取第 1 季度,但不获取下面的时期。

标签: neo4j cypher


【解决方案1】:

这对你有用吗?

它收集所有具有正确日期范围的T节点,然后过滤掉与集合中的任何节点具有T_OF关系的所有节点。

MATCH (t:T)
WHERE t.start >= 1 AND t.end <= 6
WITH COLLECT(t) AS ct
RETURN FILTER(x IN ct 
  WHERE ALL (y IN ct 
    WHERE NOT ((x)-[:T_OF]->(y))))
  AS result;

【讨论】:

  • 正是我正在寻找的想法,但对收集的东西不够熟悉,无法弄清楚。谢谢!
【解决方案2】:

您可以将路径用作表达式,也可以将它们取反。

MATCH (t:T)
WHERE t.start >= 1 AND t.end <= 6
AND NOT (t)<-[:T_OF]-()
RETURN t

【讨论】:

  • 使用您发布的内容,我返回了t3t4t5,而不是t2t5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多