Neo4j返回树中的顶级节点

时间:2015-05-22 19:39:41

标签: neo4j cypher

我在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属于该范围。由于它们与T_OF的关系t2,因此应忽略它们。

我尝试了几种不同的方式,但不幸的是我无法想出这一点。

请告诉我是否应该更好地解释。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

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