Описание задачи: на самом деле у меня есть две проблемы: первая связана с ранжированием (1,2,3 и т. Д.) Набора путей между узлами «источник / источник» и «целевой», а вторая -состоит в том, чтобы получить объединенный путь, состоящий из всех путей из набора (избегая повторяемости).
Первая проблема: существует следующий код:
CALL apoc.load.json("file:///D:/project/neo_proj/input.json") 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:3, limit:3}) YIELD path
WITH { origin: origin, path: collect(path)[..3]} AS SuggestionForOrigin
RETURN SuggestionForOrigin
С этим кодом я получаю комбинированный выводисходного / исходного узла и трех путей к целевым узлам, которые я получаю из входного JSON.Выходные данные, которые я получаю:
╒══════════════════════════════════════════════════════════════════════╕
│"SuggestionForOrigin" │
╞══════════════════════════════════════════════════════════════════════╡
│{"origin":{"name":"Sandeman Cask 33","type":"string"},"path":[[{"name"│
│:"Sandeman Cask 33","type":"string"},{"Weight":1},{"name":"Port wine",│
│"type":"string"},{"name":"Port wine","type":"string"},{"Weight":1},{"n│
│ame":"sweet"},{"name":"sweet"},{"Weight":1},{"name":"Pepsi","type":"st│
│ring"},{"name":"Pepsi","type":"string"},{"Weight":1},{"name":"Carbonat│
│ed water","type":"string"}],[{"name":"Sandeman Cask 33","type":"string│
│"},{"Weight":1},{"name":"Port wine","type":"string"},{"name":"Port win│
│e","type":"string"},{"Weight":1},{"name":"sweet"},{"name":"sweet"},{"W│
│eight":1},{"name":"Pepsi","type":"string"}]]} │
├──────────────────────────────────────────────────────────────────────┤
│{"origin":{"name":"Alcohol drinks","type":"string"},"path":[[{"name":"│
│Alcohol drinks","type":"string"},{"Weight":1},{"name":"Wine","type":"s│
│tring"},{"name":"Wine","type":"string"},{"Weight":1},{"name":"Port win│
│e","type":"string"},{"name":"Port wine","type":"string"},{"Weight":1},│
│{"name":"sweet"},{"name":"sweet"},{"Weight":1},{"name":"Pepsi","type":│
│"string"}]]} │
├──────────────────────────────────────────────────────────────────────┤
│{"origin":{"name":"Port wine","type":"string"},"path":[[{"name":"Port │
│wine","type":"string"},{"Weight":1},{"name":"sweet"},{"name":"sweet"},│
│{"Weight":1},{"name":"Pepsi","type":"string"},{"name":"Pepsi","type":"│
│string"},{"Weight":1},{"name":"Carbonated water","type":"string"},{"na│
│me":"Carbonated water","type":"string"},{"Weight":1},{"name":"Tea","ty│
│pe":"string"}],[{"name":"Port wine","type":"string"},{"Weight":1},{"na│
│me":"sweet"},{"name":"sweet"},{"Weight":1},{"name":"Pepsi","type":"str│
│ing"},{"name":"Pepsi","type":"string"},{"Weight":1},{"name":"Carbonate│
│d water","type":"string"}],[{"name":"Port wine","type":"string"},{"Wei│
│ght":1},{"name":"sweet"},{"name":"sweet"},{"Weight":1},{"name":"Pepsi"│
│,"type":"string"}]]} │
├──────────────────────────────────────────────────────────────────────┤
│{"origin":{"name":"Wine","type":"string"},"path":[[{"name":"Wine","typ│
│e":"string"},{"Weight":1},{"name":"Port wine","type":"string"},{"name"│
│:"Port wine","type":"string"},{"Weight":1},{"name":"sweet"},{"name":"s│
│weet"},{"Weight":1},{"name":"Pepsi","type":"string"},{"name":"Pepsi","│
│type":"string"},{"Weight":1},{"name":"Carbonated water","type":"string│
│"}],[{"name":"Wine","type":"string"},{"Weight":1},{"name":"Port wine",│
│"type":"string"},{"name":"Port wine","type":"string"},{"Weight":1},{"n│
│ame":"sweet"},{"name":"sweet"},{"Weight":1},{"name":"Pepsi","type":"st│
│ring"}]]} │
└──────────────────────────────────────────────────────────────────────┘
Что я ищу примерно так (однако этот код просто перечисляет кратчайшие пути из всех узлов источника / источника, в то время как мне нужно ранжировать пути для каждого источника):
CALL apoc.load.json("file:///D:/project/neo_proj/semantic_reasoner/input.json") 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:3, limit:3}) YIELD path
WITH { origin: origin, path: collect(path)[..3], rank: 'desired number based on rank'} AS SuggestionForOrigin WITH collect(SuggestionForOrigin.path) AS input
UNWIND reduce(acc=[], idx in range(0, size(input)-1) | acc + [idx+1,input[idx]]) as path_rank
RETURN path_rank
Второй выпуск тесно связан.Когда я получаю кратчайшие пути (в моем случае макс. 3), мне нужно получить граф, который будет включать все три пути без повторяемости, чтобы иметь возможность восстановить полный граф для каждого узла источника / источника.
IБуду признателен за любую помощь и предложения.Заранее спасибо!