Neo4j:仅从可能的子路径返回根节点

时间:2018-05-28 02:01:21

标签: neo4j cypher graph-theory

我有一组(n)值,它们在我的图中都有相应的节点。我从彼此的未知关系开始。 (参见蓝色的起始节点)

我想尽可能简单地找到,如果任何值/节点是任何其他值的子节点,那么应用这些规则来过滤结果:

  1. 如果节点是孩子,则丢弃它。 (白色节点)
  2. 如果节点是root,则返回它。 (绿色节点)
  3. 如果节点没有任何子节点也返回它。 (绿色节点673)
  4. 最多可以有50个起始节点。我已经尝试迭代它们,比较两个,如果它们是一个孩子,一次丢弃它们 - 但迭代次数在较大的集合中很快就会失控。我希望有一些我忽略的图形魔法。 Cypher拜托!

    谢谢!

    enter image description here

1 个答案:

答案 0 :(得分:1)

让我们假设您有一个输入参数nids - 节点的id属性的值集,目标节点具有标签Node,节点之间的关系属于hasChild类型。

然后你需要找到与输入集相对应的节点,并且没有来自与输入集相对应的节点的父节点:

UNWIND {nids} as nid
MATCH (N:Node {id: nid})
OPTIONAL MATCH (N:Node {id: nid})<-[:hasChild]-(P:Node) WHERE P.id IN {nids}
WITH N, collect(P) AS ts WHERE size(ts) = 0
RETURN N

不要忘记为节点的id属性添加索引:

CREATE INDEX ON :Node(id)