排除未连接的节点

时间:2016-09-30 09:04:43

标签: neo4j cypher

我将图表连接为:

           -->(D)-->(E)-->(F)
         /
(A)-->(B)
        \           
         -->(C)

图表是一棵树,其根= A,通过以下方式从父母与子女之间的直接关系:HAS_CHILD

我想要做的是排除给定属性的节点,例如:

MATCH (n:Node)
WHERE n.name <> "D"
return n

哪会给我一个子图:

           (E)-->(F)

(A)-->(B)
        \           
         -->(C)

从根节点无法访问E和F.如何排除这些子树?

首选结果是:

(A)-->(B)
        \           
         -->(C)

2 个答案:

答案 0 :(得分:2)

我认为我们无法全面了解您的数据以及您真正想要的内容。

我的猜测是你的数据模型是一棵树。在我看来,您正在尝试定义要排除的节点,这也排除了该节点下的所有分支(因此在您的示例中,您可能在D下面有一个丰富而复杂的子树,并且您想要排除所有这些) 。这假定了从父母到树中孩子的直接关系。

如果是这样,您可以尝试以下查询。我假设从父母到孩子的关系为:HAS_CHILD,因为那不包括在你的描述中。

MATCH (excluded:Node {name: "D"})
WITH excluded
MATCH (n:Node)
WHERE n <> excluded 
AND NOT (excluded)-[:HAS_CHILD*]->(n)
RETURN n

或者,替代方案,如果您的树很大并且排除节点下方的子树比整个树小,那么它可能会表现得更好:

MATCH (excludedRoot:Node {name: "D"})-[:HAS_CHILD*0..]->(excluded)
WITH COLLECT(excluded) as excludedNodes
MATCH (n:Node)
WHERE NOT n IN excludedNodes
RETURN n

答案 1 :(得分:1)

所以你希望所有既不是D也不是的节点只连接到D

MATCH (excluded:Node {name: "D"})
MATCH (n:Node)
WHERE n <> excluded
OPTIONAL MATCH (n)--(n2:Node)
WHERE n2 <> excluded
WITH n, collect(n2) AS nodes
WHERE size(nodes) > 0
RETURN n

这假设只有一个被排除的节点,因为它将排除每个excluded的连接节点。

如果有多个,则此修改后的查询应该有效:

MATCH (excluded:Node {name: "D"})
WITH collect(excluded) AS excluded
MATCH (n:Node)
WHERE NOT n IN excluded
OPTIONAL MATCH (n)--(n2:Node)
WHERE NOT n2 IN excluded
WITH n, collect(n2) AS nodes
WHERE size(nodes) > 0
RETURN n