我将图表连接为:
-->(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)
答案 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