密码-缺少一种可能的路径

时间:2019-06-19 18:42:14

标签: neo4j cypher

我是新来的密码表达。 我有这个数据库

CREATE
  (a:City {name: 'A'}),
  (b:City {name: 'B'}),
  (c:City {name: 'C'}),
  (d:City {name: 'D'}),
  (e:City {name: 'E'}),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 5 }]->(b),
  (b)-[:HAS_RAIL_ROAD_TO {distance : 4 }]->(c),
  (c)-[:HAS_RAIL_ROAD_TO {distance : 8 }]->(d),
  (d)-[:HAS_RAIL_ROAD_TO {distance : 8 }]->(c),
  (d)-[:HAS_RAIL_ROAD_TO {distance : 6 }]->(e),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 5 }]->(d),
  (c)-[:HAS_RAIL_ROAD_TO {distance : 2 }]->(e),
  (e)-[:HAS_RAIL_ROAD_TO {distance : 3 }]->(b),
  (a)-[:HAS_RAIL_ROAD_TO {distance : 7 }]->(e)

执行时

  MATCH(:City { name: 'A' })-[r:HAS_RAIL_ROAD_TO*4]->(:City { name: 'C' })
  return count(r)

我期望结果为3:

(A, B, C,D, C); (A, D, C, D, C); (A, D, E, B, C)

但是给出的结果是2

我认为在第二种情况下,(A, D, C, D, C)不会回到D。

您认为这是什么原因?

1 个答案:

答案 0 :(得分:2)

这与uniqueness behavior in Cypher traversals有关,它确保每个MATCH模式的每个路径只能遍历一次关系。

(A, D, C, D, C)将不起作用,因为D和C之间只有两个关系,并且D, C, D部分遍历了这两个关系,而没有其他关系可用于再次从D返回到C。 / p>

这种唯一性行为在大多数情况下很有用,并且可以防止无限制的可变长度模式的任何无限循环问题。

如果您确实需要考虑在路径中重用关系,则需要另一种方法,该方法可让您在遍历期间更改唯一性行为。

您可以使用path expander procs中的APOC Procedures来更改唯一性并扩展,但是请确保设置一个上限(通过maxLevel配置属性),否则您将面临无限的风险循环遍历可能会炸毁堆。

MATCH (start:City { name: 'A' }), (end:City { name: 'C' })
CALL apoc.path.expandConfig(start, {endNodes:[end], minLevel:4, maxLevel:4, relationshipFilter:'HAS_RAIL_ROAD_TO>', uniqueness:'NONE'}) YIELD path
RETURN [node in nodes(path) | node.name] as path