首页 > 解决方案 > Neo4j:强制节点唯一性,一对一匹配

问题描述

与我在下面所做的相比,是否有更优化的方法来确保查询图中的节点与获得的匹配中的节点之间的一对一关系?

例如,假设我想找到由唯一节点组成的长度为 4 的路径。我可以有这样的查询:

MATCH (n2)--(n1)--(n0)--(n3)--(n4)
return n0,n1,n2,n3,n4

但是,这并不能确保匹配的节点是不同的。例如,允许 n2 和 n4 匹配(这会给我一个循环)。我可以添加一个 where 子句“where not(n2=n4)”,但其他节点也可以匹配。似乎我需要为我想要唯一的所有节点对添加此子句,这在大型子图上很烦人。

有没有更好的方法来确保一对一的关系?

标签: neo4jcypher

解决方案


使用路径变量并验证路径中节点的唯一性:

MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
      // Enumerate all nodes in the path
WHERE ALL(n1 IN nodes(p) WHERE
        // Each node must occur only once
        size([n2 IN nodes(p) WHERE n1 = n2]) = 1
      )
return n1, n2, n3, n4, n5

或者您可以使用该功能检查列表中的重复项APOC library

MATCH p = (n1)--(n2)--(n3)--(n4)--(n5)
WHERE apoc.coll.containsDuplicates(nodes(p)) = FALSE
return n1, n2, n3, n4, n5

推荐阅读