Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 两个方向上都有rels的Neo4j最短路径_Graph_Neo4j_Shortest Path - Fatal编程技术网

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`