Объединение связующего дерева APOC с взвешенным путем - PullRequest
0 голосов
/ 19 апреля 2019

Мне нужно получить кратчайший путь (в зависимости от веса) от набора начальных узлов до набора конечных узлов. Другим важным требованием, почему я использую 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 с взвешенными ссылками / отношениями, возможно, вы могли бы посоветовать мне другой обходной путь для этого случая. Заранее спасибо!

...