[英]Neo4j Cypher Query to list paths of nodes with a single relation based on a start-end condition
[英]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的缺乏基本的撤消功能之前找到正确的节点(但你不能把一个RETURN
在FOREACH
内执行命令(出于某种疯狂的原因)。
如何使用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.