Neo4j:强制执行节点唯一性,一对一匹配

时间:2019-02-17 14:51:17

标签: neo4j cypher

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

pay_slip

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

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

答案 1 :(得分:0)

或者,根据实际查询,您可以使用APOC过程中的路径扩展程序proc,因为有一种方法可以指定您只希望节点不能在每个路径中重复的路径。

例如:

MATCH (n)
CALL apoc.path.expandConfig(n, {minLevel:4, maxLevel:4, uniqueness:'NODE_PATH'}) YIELD path
WITH nodes(path) as nodes
RETURN nodes[0] as n1, nodes[1] as n2, nodes[2] as n3, nodes[3] as n4, nodes[4] as n5

您当然希望至少对实际查询使用标签,否则将尝试在数据库中的每个节点上进行扩展。