在 Neo4j 中查找 DAG 的根

Finding the root of a DAG in Neo4j

我在 Neo4j 中有一个 DAG,想找到根节点。

我试过这个:

MATCH (r) WHERE NOT ()-[:HAS_CHILD]->(r) RETURN r

即不是另一个节点的 child 的所有节点。然而,这返回了几千个结果;这是一个只有一个根的DAG!

我拿了一个返回的节点并查看了它的邻域。它有 parents 和 children 所以我的查询是错误的。但我找不到位置或原因。

我使用的是测试版 neo4j-community-2.2.0-M03,因此不能排除错误。然而,所有这些都是通过 Neo4j 控制台进行的。

非常感谢您的帮助 - 克里斯托弗

我认为你非常接近于找到没有内向关系的节点。您只需要将 not 放在括号中的 where 子句中。

MATCH r-->() 
WHERE NOT ( ()-[:HAS_CHILD]->r ) 
RETURN r

更新回答。这是一个带有单个根节点的小型有向无环图。

CREATE (a:Node {name:'A'})
CREATE (b:Node {name:'B'})
CREATE (c:Node {name:'C'})
CREATE (d:Node {name:'D'})
CREATE (e:Node {name:'E'})
CREATE (f:Node {name:'F'})
CREATE (g:Node {name:'G'})
CREATE (h:Node {name:'H'})
CREATE a-[:POINTS]->b
CREATE a-[:POINTS]->c
CREATE c-[:POINTS]->d
CREATE c-[:POINTS]->e
CREATE c-[:POINTS]->f
CREATE f-[:POINTS]->g
CREATE f-[:POINTS]->h

当我用下面的查询查询它时,我只得到一个根。我也在使用社区 2.2.0-M03。

MATCH (r:Node)-->() 
WHERE NOT ( ()-->r ) 
RETURN r