Neo4J,获取所有路径和最短路径

Neo4J,获取所有路径和最短路径,neo4j,nosql,Neo4j,Nosql,我有20个节点和21条路径,它们应该代表一个迷宫 现在我想找到从开始到结束的所有可能路径(共3条) 我还想找到重量最小的路径,以防损坏最小 非常感谢您对正确语法的任何帮助和任何改进提示 这是我尝试过的问题,不理解,但失败了 MATCH p=(a{name:“START”})-[:PATH*tall woods..guard]->(s{name:“Finish”}) 返回p作为最短路径, 将(长度=0,关系中的r(p)|长度+r.length)减少为总长度 按总长度订购 MATCH p=(a{na

我有20个节点和21条路径,它们应该代表一个迷宫

现在我想找到从开始到结束的所有可能路径(共3条)

我还想找到重量最小的路径,以防损坏最小

非常感谢您对正确语法的任何帮助和任何改进提示

这是我尝试过的问题,不理解,但失败了

MATCH p=(a{name:“START”})-[:PATH*tall woods..guard]->(s{name:“Finish”})
返回p作为最短路径,
将(长度=0,关系中的r(p)|长度+r.length)减少为总长度
按总长度订购

MATCH p=(a{name:“START”})-[:ROAD*tall woods..guard]->(s{name:“Finish”})
返回p作为最短路径,
将(长度=0,关系中的r(p)|长度+r.length)减少为总长度
按总长度订购
限制1

我假设[:Path*toll woods..guard]是错误的,我应该用逗号或其他东西分隔所有路径吗

这是我的迷宫:

create(a:LABYRINTH {name:"START"})-[:PATH {name:"spiders", damage:1}]-> (b:LABYRINTH{name:"B"}),
(a)-[:PATH {name:"tall woods", damage:1}]->(c:LABYRINTH {name:"C"}),
(c)-[:PATH {name:"lizards", damage:1}]->(d:LABYRINTH {name:"D"}),
(c)-[:PATH {name:"gremlins", damage:3}]-> (e:LABYRINTH {name:"E"}),
(e)-[:PATH {name:"dark woods", damage:0}]->(f:LABYRINTH {name:"F"}),
(e)-[:PATH {name:"old bridge", damage:2}]->(g:LABYRINTH {name:"G"}),
(g)-[:PATH {name:"orc", damage:5}]->(i:LABYRINTH {name:"I"}),
(i)-[:PATH {name:"dead end", damage:0}]->(h: LABYRINTH {name:"H"}),
(i)-[:PATH {name:"dusty planes", damage:0}]->(j: LABYRINTH {name:"J"}),
(i)-[:PATH {name:"ape", damage:3}]->(k: LABYRINTH {name:"K"}),
(k)-[:PATH {name:"mob", damage:1}]->(q: LABYRINTH {name:"Q"}),
(g)-[:PATH {name:"woods", damage:0}]->(z: LABYRINTH {name:"Z"}),
(z)-[:PATH {name:"dead planes", damage:0}]->(k),
(z)-[:PATH {name:"desert", damage:1}]->(m: LABYRINTH {name:"M"}),
(m)-[:PATH {name:"gorilla", damage:0}]->(n: LABYRINTH {name:"N"}),
(m)-[:PATH {name:"bridge", damage:0}]->(l: LABYRINTH {name:"L"}),
(l)-[:PATH {name:"mud", damage:1}]->(o: LABYRINTH {name:"O"}),
(i)-[:PATH {name:"waters", damage:2}]->(r: LABYRINTH {name:"R"}),
(r)-[:PATH {name:"witch", damage:1}]->(p: LABYRINTH {name:"P"}),
(q)-[:PATH {name:"guard", damage:0}]->(s: LABYRINTH {name:"Finish"}),
(r)-[:PATH {name:"old witch", damage:1}]->(s)
使用时,需要使用整数指定最小和最大关系遍历次数(这些是可选的),不能在此处提供属性值

我强烈建议您通读《开发人员指南》,尤其是当您试图让某些东西工作时遇到困难时。快速检查变量关系将很容易发现使用此功能的正确方法

要查找所有可能的路径,您需要在“开始”和“完成”节点上进行匹配,然后使用它们之间的变量关系进行匹配:

MATCH (a:LABYRINTH {name:"START"}), (s:LABYRINTH {name:"Finish"})
MATCH p = (a)-[:PATH*]->(s)
RETURN p
就重量最小的最短路径而言,安装后最容易使用。您需要提供开始和结束节点、要遍历的关系类型和方向的过滤器,以及用于权重的关系属性

MATCH (start:LABYRINTH{name:'START'}), (end:LABYRINTH{name:'Finish'})
CALL apoc.algo.dijkstra(start, end, 'PATH>', 'damage') YIELD path, weight
RETURN path, weight
编辑

对于如何在不使用APOC程序的情况下实现这一点(尽管建议这样做,但安装过程非常简单,并且您可以获得相当多的有用功能),您可以做到这一点,但您需要自己制作重量评估

您可以使用reduce()函数来实现这一点,您可以在路径中的关系集合上使用reduce()函数来获得损坏的总和,然后根据该总和进行排序,获得损坏最小的路径

MATCH p=(:LABYRINTH {name:"START"})-[rels:PATH*]->(:LABYRINTH {name:"Finish"})
WITH p, REDUCE(weight=0, rel in rels | weight + rel.damage) as damage
RETURN p, damage 
ORDER BY damage ASC
LIMIT 1

请至少发布一个您已经尝试过的查询。您显示的是您的
创建
。请相应地编辑您的问题,以显示您尝试过的查询、结果和特定问题。权重最小的最短路径,是否有其他方法可以在不安装APOC过程的情况下执行此操作?添加了一个适用于您的APOC过程的替代方法。