Я пытаюсь получить кратчайший путь между узлом (a)
и узлом (c)
через определенный узел (b)
с меткой SomeImportantLabel
.Нарисовано, это то, что я хочу:
(a)-(?..)-(b:SomeImportantLabel)-(?..)-(c)
Обратите внимание, что (?..)
означает, что между ними может быть 'n'
количество узлов.
Примерно так будет сделка Iищу:
match p = allShortestPaths((a)-[*]-(b:SomeImportantLabel)-[*]-(c))
where id(a) = 123 and id(c) = 456
return nodes(p) as nodes, relationships(p) as rels;
Так как в функции shortestPath
/ allShortestPaths
невозможно иметь несколько отношений, я прочитал здесь на SO
, что вам придется делать это таким образом:
match p1 = allShortestPaths((a)-[*]-(b:SomeImportantLabel)), p2=allShortestPaths((b:SomeImportantLabel)-[*]-(b))
where id(a) = 123 and id(c) = 456
return nodes(p1)+nodes(p2) as nodes, relationships(p1)+relationships(p2) as rels;
Это, однако, дает мне слишком много узлов, которые даже не задействованы, и обработка этого запроса занимает вечность.Я думаю, это потому, что я не уверен, используется ли один и тот же узел (b)
в 2 функциях allShortestPaths.Это будет результат более или менее:
/-(v2)
/-(v1)
(a)-(x1)-(b)-(x2)-(c)
\-(y1) \-(z1)-(z2)
Идеальным решением будет что-то вроде этого:
(a)-(x1)-(b1)-(x2)-(c)
\-(b2)-(y1)-(y2)-(c)
Это означает, что между (a)
и 2 найдены 2 кратчайших пути.(c)
, которые проходят через узел (b)
с меткой 'SomeImportantLabel'.