【发布时间】:2018-11-30 05:34:48
【问题描述】:
我想通过删除不必要的节点来稍微清理一下我的图形数据库。在一种情况下,不必要的节点是节点 A 和 C 之间的节点 B,其中 B 与节点 C 具有相同的名称,并且没有其他传入关系。我无法提出限制传入边数的 Cypher 查询。
第一部分很简单:
MATCH (n1:TypeA)<-[r1:Inside]-(n2:TypeB)<-[r2:Inside]-(n3:TypeC)
WHERE n2.name = n3.name
基于其他 SE 问题(尤其是 this one),我尝试执行以下操作:
WITH n2, collect(r2) as rr
WHERE length(rr) = 1
RETURN n2
但这也返回了具有多个传入边的节点。看来我的长度上的WHERE 子句没有过滤返回的n2 节点。我尝试了一些我在网上找到的其他东西,但它们要么没有返回,要么没有
在当前版本中语法正确的更长。
找到与模式匹配的n2 节点后,我想将n3 直接连接到n1 和DETACH DELETE n2。同样,当我不需要限制 n2 的传入边数时,我很容易做到这一点。上一个问题有FOREACH (r IN rr | DELETE r),但我想分离删除n2 节点,而不仅仅是那些边缘。我不知道如何正确调整它以在附加到rs 的节点上进行操作,我当然想确保它在删除任何内容之前找到正确的节点,因为 Neo4j 缺乏基本的撤消功能(但你不能放出于某种疯狂的原因,FOREACH 中的 RETURN 命令)。
如何使用 Cypher 根据传入边数过滤路径上的节点?
我想我可以在 py2neo 中做到这一点,首先收集与模式匹配的所有 n1,n2,n3 三元组,然后遍历每个返回的记录,如果 n2 只有一个传入边,则将它们添加到列表中。然后浏览该列表并执行修剪操作,但如果这可以在纯 Cypher 中完成,那么我想知道如何进行,因为我有许多类似的调整要做。
【问题讨论】: