Я вычисляю набор путей, используя apoc.algo.dijkstra.Моя цель - присвоить звание каждому из предложенных путей.Важным является то, что все веса среди узлов являются поплавками.Cypher code:
...
WITH origin, target CALL apoc.algo.dijkstra(origin, target, 'link',
'Weight') yield path as path, weight as weight
...
что у меня сейчас есть:
Path 1 - Weight: 1.2344332423
Path 2 - Weight: 0.8432423321
Path 3 - Weight: 0.9144331653
Что-то, что мне нужно:
rank: 1, weight: 1.2344332423
rank: 2, weight: 0.9144331653
rank: 3, weight: 0.8432423321
Как я могу сделать это в запросе Cypher.
Примечание: я уже читал пост, связанный с вычислением ранга, но он не подходит для моего конкретного случая.
Как рассчитать ранг в Neo4j
Спасибо!
Дополнительная информация: сейчас я пытаюсь объединить значения ранжирования и уайта с источником и путем.Я мог бы успешно сделать это для происхождения:
CALL
apoc.load.json("file:///.../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.algo.dijkstra(origin, target, 'link', 'Weight') yield path as
path, weight as weight
WITH origin, path, weight ORDER BY weight ASC WITH {origin: origin, weight:
collect(weight)} AS SuggestionForOrigin UNWIND [r in range(1,
SIZE(SuggestionForOrigin.weight)) | {origin: SuggestionForOrigin.origin,
rank:r, weight: SuggestionForOrigin.weight[r-1]}] AS suggestion RETURN
suggestion
Тогда я получаю следующий результат (который меня устраивает):
{"origin": {"name": "A","type": "string"},"rank": 1,"weight": 0.0}
{"origin": {"name": "A","type": "string"},"rank": 2,"weight":
0.6180339887498948}
{"origin": {"name": "P1","type": "string"},"rank": 1,"weight":
0.6180339887498948}
{"origin": {"name": "P1","type": "string"},"rank": 2,"weight":
1.2360679774997896}
Но когда я пытаюсь объединить «путь»параметр, я попал в беду.Я думаю, я компенсирую вещи.Что-то, чего я хотел бы достичь, это:
{"origin": {....}, "path": {...}, "rank": 1,"weight": 0.0}
И это должно быть связано с конкретным узлом источника, если у меня есть 3 предложения путей для первого источника, их нужно объединить вместе.Я пробовал, но это не работает так, как я хочу:
...
CALL apoc.algo.dijkstra(origin, target, 'link', 'Weight') yield path as
path, weight
WITH {origin: origin, path: collect(path), weight: collect(weight)} AS
SuggestionForOrigin
UNWIND [r in range(1, SIZE(SuggestionForOrigin.weight)) | {rank:r, weight:
SuggestionForOrigin.weight[r-1], path: SuggestionForOrigin}] AS suggestion
WITH {origin: SuggestionForOrigin.origin, suggestions: collect(suggestion)
[0..3]} AS output
RETURN output
Буду признателен, если вы поможете.