Graph 两个方向上都有rels的Neo4j最短路径
我用函数设置了一个图表Graph 两个方向上都有rels的Neo4j最短路径,graph,neo4j,shortest-path,Graph,Neo4j,Shortest Path,我用函数设置了一个图表 create (a:station {name:"a"}), (b:station {name:"b"}), (c:station {name:"c"}), (d:station {name:"d"}), (e:station {name:"e"}), (f:station {name:"f"}), (a)-[:CONNECTS_TO {time:8}]->(b), (a)-[:CONNECTS_TO {time:4}]->(c), (a)-[:CONNECT
create (a:station {name:"a"}),
(b:station {name:"b"}),
(c:station {name:"c"}),
(d:station {name:"d"}),
(e:station {name:"e"}),
(f:station {name:"f"}),
(a)-[:CONNECTS_TO {time:8}]->(b),
(a)-[:CONNECTS_TO {time:4}]->(c),
(a)-[:CONNECTS_TO {time:10}]->(d),
(b)-[:CONNECTS_TO {time:3}]->(c),
(b)-[:CONNECTS_TO {time:9}]->(e),
(c)-[:CONNECTS_TO {time:40}]->(f),
(d)-[:CONNECTS_TO {time:5}]->(e),
(e)-[:CONNECTS_TO {time:3}]->(f)
以及使用该函数
START startStation=node:node_auto_index(name = "a"), endStation=node:node_auto_index(name = "f")
MATCH p =(startStation)-[r*]->(endStation)
WITH extract(x IN rels(p)| x.time) AS Times, length(p) AS `Number of Stops`, reduce(totalTime = 0, x IN rels(p)| totalTime + x.time) AS `Total Time`, extract(x IN nodes(p)| x.name) AS Route
RETURN Route, Times, `Total Time`, `Number of Stops`
ORDER BY `Total Time`
然后返回结果
+-------------------------------------------------------------+
| Route | Times | Total Time | Number of Stops |
+-------------------------------------------------------------+
| ["a","d","e","f"] | [10,5,3] | 18 | 3 |
| ["a","b","e","f"] | [8,9,3] | 20 | 3 |
| ["a","c","f"] | [4,40] | 44 | 2 |
| ["a","b","c","f"] | [8,3,40] | 51 | 3 |
+-------------------------------------------------------------+
这很好,只是因为它是一个有向图,并且没有从c->b
返回的路径(例如)[a,c,b,e,f]
是长度为4的有效路径
所以,如果我加上反向路径
MATCH (START)-[r:CONNECTS_TO]->(END )
CREATE UNIQUE (START)<-[:CONNECTS_TO { time:r.time }]-(END )
这确实包括路径[a,c,b,e,f]
,但也包括[a,c,b,c,f]
使用c
两次和[a,c,f,e,f]
使用f
(目的地?!)两次
是否有一种方法可以过滤路径,使每个路径只包含同一节点一次?您可以在事后进行过滤,但这可能不是最快的方法 大概是这样的:
START startStation=node:node_auto_index(name = "a"), endStation=node:node_auto_index(name = "f")
MATCH p = (startStation)-[r*..4]->(endStation)
WHERE length(reduce (a=[startStation], n IN nodes(p) | CASE WHEN n IN a THEN a ELSE a + n END)) = length(nodes(p))
WITH extract(x IN rels(p)| x.time) AS Times, length(p) AS `Number of Stops`, reduce(totalTime = 0, x IN rels(p)| totalTime + x.time) AS `Total Time`, extract(x IN nodes(p)| x.name) AS Route
RETURN Route, Times, `Total Time`, `Number of Stops`
ORDER BY `Total Time`
我创建了一个带有您的问题和答案的图形列表,作为一个可执行的实时文档
请参见此处:非常感谢!这正是我想要的谢谢:顺便说一句。。。从Neo4j手册来看,RESTAPI方法似乎有一个Dijkstra算法最短路径函数。这在Cypher中也可用吗?不幸的是,Cypher中还没有Dijkstra。这也是有计划的。
START startStation=node:node_auto_index(name = "a"), endStation=node:node_auto_index(name = "f")
MATCH p = (startStation)-[r*..4]->(endStation)
WHERE length(reduce (a=[startStation], n IN nodes(p) | CASE WHEN n IN a THEN a ELSE a + n END)) = length(nodes(p))
WITH extract(x IN rels(p)| x.time) AS Times, length(p) AS `Number of Stops`, reduce(totalTime = 0, x IN rels(p)| totalTime + x.time) AS `Total Time`, extract(x IN nodes(p)| x.name) AS Route
RETURN Route, Times, `Total Time`, `Number of Stops`
ORDER BY `Total Time`