首页 文章

NEO4j Cypher查询以返回具有连接节点数量条件的路径

提问于
浏览
0

我想通过删除不必要的节点来清理我的图形数据库 . 在一种情况下,不必要的节点是节点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 直接连接到 n1DETACH DELETE n2 . 再次,当我不需要限制 n2 的传入边数时,我很容易就能做到这一点 . 上一个问题有 FOREACH (r IN rr | DELETE r) ,但我想分离删除 n2 节点,而不仅仅是那些边缘 . 我不知道如何正确地适应这一点来操作连接到 r 的节点,我当然希望确保它 RETURN 命令在 FOREACH 内放置一些疯狂的原因) .

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

我想我可以在py2neo中通过首先收集匹配模式的所有 n1,n2,n3 三元组,然后遍历每个返回的记录并将它们添加到列表中,如果 n2 只有一个传入边缘 . 然后浏览该列表并执行修剪操作,但如果这可以在纯Cypher中完成,那么我想知道如何,因为我有许多类似的调整 .

2 回答

  • 0

    您需要在 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
    
  • 0

    借用this answer的一些见解,我想出了一个似乎有用的kludge .

    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查询的任何改进或对其工作原理或原因的解释都将不胜感激 .

相关问题