Ранжирование множества путей и представление совместного пути - PullRequest
0 голосов
/ 26 февраля 2019

Описание задачи: на самом деле у меня есть две проблемы: первая связана с ранжированием (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Буду признателен за любую помощь и предложения.Заранее спасибо!

...