Мне нужно получить кратчайший путь (в зависимости от веса) от набора начальных узлов до набора конечных узлов. Другим важным требованием, почему я использую spanningTree, является необходимость обрабатывать исходный и целевой узлы по отдельности (взять один начальный узел и построить набор путей к конечным узлам, затем взять другой начальный узел и сделать то же самое) и просто посетить один узел однажды избегая повторений.
Вот пример кода для spanningTree:
CALL
apoc.load.json("file:///..........")
YIELD value UNWIND value.origin AS orig
MATCH(origin:concept{name:orig.label}) WITH value, collect(origin) as origins
UNWIND value.target AS tar MATCH(target:concept{name:tar.label})
UNWIND origins AS origin WITH origin, target
CALL apoc.path.spanningTree(origin, {terminatorNodes:[target], maxLevel:5, limit:3})
Однако, прежде чем перейти к путям, мне нужно задать условия, чтобы мне были нужны именно пути, определенные через сумму весов, что-то вроде:
path=((origin)-[rels:link*]-(target)) reduce(weight=0, rel in rels | weight + rel.Weight)
Я знаю о значении apoc.path.spanningTree, и нет никакой возможности продолжить работу с весами:
call apoc.path.spanningTree(startNode <id>Node/list, {maxLevel,
relationshipFilter, labelFilter, bfs:true, filterStartNode:true, limit,
optional:false, endNodes, terminatorNodes, sequence, beginSequenceAtStart:true})
yield path
Важно, мне не нужен случай с:
length(path)
В результате мне нужно получить несколько путей для каждого начального узла, которые характеризуются весом, а не количеством прыжков между началом и концом.
Если нет возможности объединить spanningTree с взвешенными ссылками / отношениями, возможно, вы могли бы посоветовать мне другой обходной путь для этого случая. Заранее спасибо!