Neo4j匹配路径时排除具有特定标签的节点

6
我是一名有帮助的助手,以下是您需要翻译的内容:

我在尝试从neo4j中检索路径时遇到了问题,需要排除某些标签。

例如,我有:

               -->(h)-->(j)
              /
(a)-->(b)-->(c)-->(d)-->(i)
        \           
         -->(f)-->(g)

使用 h 节点带有 Deleted 标签。

我有一个查询

MATCH path = (n)-[*]->(child) where id(n)={id of node a} and NOT child:Deleted RETURN path

我希望这个查询返回完整路径,但排除节点 h 的子树,因为节点 h 被标记为 已删除

返回的树应该如下所示

(a)-->(b)-->(c)-->(d)-->(i)
        \           
         -->(f)-->(g)

但是这个查询似乎不起作用。

有人可以帮助我吗?

谢谢。

3个回答

8
我成功的方法是对路径中的节点进行列表推导式:
MATCH path = ()-[*]->()
WHERE NONE(n IN nodes(path) WHERE n:Deleted)
RETURN path

3
您可以使用APOC Procedures,与路径扩展器功能一起使用黑名单,在遍历期间防止扩展到带有黑名单标签的节点。
match (a)
where id(a) = {id of node a}
call apoc.path.expandConfig(a, {labelFilter:'-Deleted'}) yield path
return path

-2

你需要检查两个节点的标签:

match p=((a)-[r:NEXT]->(b))
where  not (a:Deleted or b:Deleted)
return p

这里有另一个例子:

match (a)-[r:NEXT]->(b) 
where  not (("Deleted" in labels(a)) or
            ("Deleted" in labels(b))) 
return a, r, b

嗨Tim,实际上我想要检查所有节点,不仅仅是a和b。 - jasonfungsing
这是一个匹配模式,所以它将检查所有的节点。我在这里复制了你的图表,并且它可以做到你想要的。 - Tim Kuehn
我不确定我理解得对。似乎这只检索到b节点,而没有进一步到c或f节点甚至更远的节点。 - jasonfungsing
我觉得你把占位符和标签混淆了。我的匹配中的a和b是图表通用的,并不对应任何标签。 - Tim Kuehn
尝试将该模式应用于您的数据,看看会发生什么。 - Tim Kuehn
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接