如何在查询中修剪分支?

时间:2017-03-01 07:15:06

标签: neo4j cypher

假设我有一棵树,其中某些节点具有给定类型的关系,除了那些具有给定关系 及其后代 的节点之外,我将如何返回树中的所有节点?强>

我已经用这样的东西到达了一半(树构建在has链接上):

match (root: {Name: 'Root'})-[:has*]->(n) where not (n)-[:Exemption]-() return n

但是,当然,这会排除关系类型为Exemption 而不是其后代 的节点,因此后代显示为未连接的节点< / p>

如何构建查询?

3 个答案:

答案 0 :(得分:3)

此查询应该有效:

MATCH p=({Name: 'Root'})-[:has*]->(n)
WHERE NONE(x IN NODES(p) WHERE (x)-[:Exemption]-())
RETURN n;

它会过滤掉与{也}具有:has关系的节点的所有:Exemption关系路径。

答案 1 :(得分:1)

我可能会把路径分成两部分:

MATCH p=(:Label {Name: 'Root'})-[:has*]->(n) WHERE NOT EXISTS ((n)-[:Exemption]->())
MATCH p2 = (n)-[:has*]->(m) WHERE NOT (m)-[:has]->()
RETURN p,p2;

答案 2 :(得分:0)

经过一些实验,这很有效:

match (root: {Name: 'Root'})-[:has*]->(n)
match (m)-[:has*]->(n) 
where not (m)-[:Exemption]-() 
return n

基本上说:找到路径,对于该路径上的任何节点,遍历以确保没有祖先显示异常。所以我在这里否定的是用第二场比赛创建的子路径