2016-09-30 127 views
2

我有一个图表连接为:排除节点是悬空

  -->(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

我觉得我们没有数据的全貌,你真的想要的这里。

我的猜测是你的数据模型是一棵树。在我看来,你试图定义一个要排除的节点,这也排除了该节点下的所有分支(所以在你的例子中,你可能在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 
+0

你是正确的,我会更新我的问题。 – drowzy

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