繁体   English   中英

NEO4j Cypher查询返回条件为连接节点数的路径

[英]NEO4j Cypher query to return paths with a condition on the number of connected nodes

我想通过删除不必要的节点来稍微清理我的图形数据库。 在一种情况下,不必要的节点是节点A和C之间的节点B,其中B与节点C具有相同的名称,并且没有其他传入关系。 我在提出限制进入边缘数量的Cypher查询时遇到了麻烦。

第一部分很简单:

MATCH (n1:TypeA)<-[r1:Inside]-(n2:TypeB)<-[r2:Inside]-(n3:TypeC)
WHERE n2.name = n3.name

根据其他SE问题(尤其是这一问题),我然后尝试执行以下操作:

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 S和我当然希望确保它删除任何内容,因为Neo4j的缺乏基本的撤消功能之前找到正确的节点(但你不能把一个RETURNFOREACH内执行命令(出于某种疯狂的原因)。

如何使用Cypher按传入边缘的数量过滤路径上的节点?

我想我可以在py2neo中做到这一点,方法是先收集所有与模式匹配的n1,n2,n3三元组,然后遍历每个返回的记录,如果n2仅具有一个传入边缘,则将它们添加到列表中。 然后遍历该列表并执行修整操作,但是如果可以用纯Cypher完成,那么我想知道如何做,因为我需要进行许多类似的调整。

您需要在WITH语句中传递path

MATCH path = (n1:Ward)<-[r1:PARTOF]-(n2:Unknown)<-[r2:PARTOF]-(n3:Chome)
WHERE n2.name = n3.name
WITH path, size((n2)<-[:PARTOF]-()) as degree
WHERE degree = 1
RETURN path

或更短的像这样:

MATCH path = (n1:Ward)<-[r1:PARTOF]-(n2:Unknown)<-[r2:PARTOF]-(n3:Chome)
WHERE n2.name = n3.name
AND size((n2)<-[:PARTOF]-()) = 1
RETURN path

这个答案中获得一些见识,我想到了一个似乎可行的方法。

MATCH path = (n1:Ward)<-[r1:PARTOF]-(n2:Unknown)<-[r2:PARTOF]-(n3:Chome)
WHERE n2.name = n3.name
WITH n2, size((n2)<-[:PARTOF]-()) as degree
WHERE degree = 1
MATCH (n1:Ward)<-[r1:PARTOF]-(n2:Unknown)<-[r2:PARTOF]-(n3:Chome)
RETURN n1,n2,n3

我希望并不需要所有部分,也不是一个有效的解决方案,但是我还不知道要改进什么。

例如,我将第一行定义为path ,但是我不能在倒数第二行中使用MATCH path ,我也不知道为什么。

另外,如果我将WITH size((n2)<-[:PARTOF]-()) as degree (在WITH之后删除n2,则它不仅返回度数> 1的n2 ,而且还返回与其连接的所有节点(甚至比n3节点还多)。 我不知道为什么会这样,并且WITH的Neo4j文档没有示例或描述来帮助我理解为什么在这里需要n2 对于我的Cypher查询的任何改进或对其工作方式原因的解释,将不胜感激。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM