我是Neo4j的新手,只是研究它是否符合我的需求。具有下图:
CREATE (a:Stop {name: 'A'})-[:ROUTE {dist: 1}]->(b:Stop {name: 'B'})
CREATE (a)-[:ROUTE {dist: 4}]->(c:Stop {name: 'C'})
CREATE (a)-[:ROUTE {dist: 10}]->(d:Stop {name: 'D'})
CREATE (b)-[:ROUTE {dist: 3}]->(e:Stop {name: 'E'})
CREATE (c)-[:ROUTE {dist: 4}]->(d)
CREATE (c)-[:ROUTE {dist: 2}]->(f:Stop {name: 'F'})
CREATE (d)-[:ROUTE {dist: 1}]->(e)
CREATE (e)-[:ROUTE {dist: 3}]->(b)
CREATE (e)-[:ROUTE {dist: 2}]->(a)
CREATE (f)-[:ROUTE {dist: 1}]->(d)
我该如何创建某些限制为指定里程的自行车路线?假设我想获得从“ E”到“ E”的所有可能路线,总里程数小于16,并允许任何节点到节点关系的重复。结果应该是这样的:
|---------------|---------|
| Route | Mileage |
|---------------|---------|
| E-A-B-E | 6 |
| E-A-B-E-B-E | 15 |
| E-A-B-E-A-B-E | 12 |
| ... | |
重点是要复制路线,如E-A-B-E-A-B-E。这可能仅与密码有关吗?还是有更好的方法,例如通过密码获得所有唯一的路线,然后以某种方式在后端计算可能的圈数?根据我的实验,我无法让密码器遍历相同的节点两次或更多次。
答案 0 :(得分:1)
Cypher对唯一性有一个固有的限制,但它不是基于节点的,因此不会阻止对节点的重新访问。它可以防止在每个路径中多次遍历相同的关系。这就是为什么您不能执行E-A-B-E-B-E
的原因,因为这样会多次遍历B-E
关系。
此行为的主要原因是在执行可变长度扩展时防止无限循环,如果您需要不同形式的遍历唯一性以允许重复遍历节点和关系,这对您来说是非常现实的风险。
虽然APOC过程具有可使用不同遍历唯一性的路径扩展器过程,但几乎可以肯定会遇到无限循环,除非您设置最大跳数。当前,路径扩展器无法进行属性访问,因此您无法汇总属性值并停止在某些阈值上。