我是新来的密码表达。 我有这个数据库
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。
您认为这是什么原因?
答案 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