我想通过删除不必要的节点来清理我的图形数据库 . 在一种情况下,不必要的节点是节点A和C之间的节点B,其中B具有与节点C相同的名称和NO其他传入关系 . 我无法提出限制传入边数的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
节点,而不仅仅是那些边缘 . 我不知道如何正确地适应这一点来操作连接到 r
的节点,我当然希望确保它 RETURN
命令在 FOREACH
内放置一些疯狂的原因) .
如何使用Cypher通过传入边数过滤路径上的节点?
我想我可以在py2neo中通过首先收集匹配模式的所有 n1,n2,n3
三元组,然后遍历每个返回的记录并将它们添加到列表中,如果 n2
只有一个传入边缘 . 然后浏览该列表并执行修剪操作,但如果这可以在纯Cypher中完成,那么我想知道如何,因为我有许多类似的调整 .
2 回答
您需要在
WITH
语句中传递path
.或者像这样短:
借用this answer的一些见解,我想出了一个似乎有用的kludge .
我希望并非所有部分都是必需的,而且它不是一个有效的解决方案,但我还不知道还有什么能够改进它 .
例如,我将第一行定义为
path
,但我不能在倒数第二行使用MATCH path
,我不知道为什么 .此外,如果我写
WITH size((n2)<-[:PARTOF]-()) as degree
(在WITH之后删除n2,
),它不仅返回程度> 1的n2
,还返回连接到它们的所有节点(甚至超过n3
节点) . 我不知道为什么它的行为像这样,并且WITH的Neo4j文档没有示例或描述来帮助我理解为什么n2
在这里是必要的 . 我对Cypher查询的任何改进或对其工作原理或原因的解释都将不胜感激 .