Как рассчитать ранг для значений с плавающей запятой в Neo4j?

Я рассчитываю набор путей, используя apoc.algo.dijkstra. Моя цель — присвоить ранг каждому из предложенных путей. Важно то, что все веса среди узлов являются числами с плавающей запятой. Код шифра:

 ...
 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

Я был бы признателен, если бы вы могли помочь.


person Artem Nazarenko    schedule 25.06.2019    source источник


Ответы (1)


Это может сработать для вас:

...
WITH origin, target
CALL apoc.algo.dijkstra(origin, target, 'link', 'Weight') YIELD weight
WITH weight
ORDER BY weight DESC
WITH COLLECT(weight) AS ws
UNWIND [r IN RANGE(1, SIZE(ws)) | {rank:r, weight: ws[r-1]}] AS res
RETURN res;

Результат (при условии ваших выборочных данных) будет выглядеть следующим образом:

╒════════════════════════════════╕
│"res"                           │
╞════════════════════════════════╡
│{"rank":1,"weight":1.2344332423}│
├────────────────────────────────┤
│{"rank":2,"weight":0.9144331653}│
├────────────────────────────────┤
│{"rank":3,"weight":0.8432423321}│
└────────────────────────────────┘

[ОБНОВИТЬ]

Если вы хотите также вернуть origin и path (и ранжировать по возрастанию веса), см. этот ответ.

person cybersam    schedule 25.06.2019
comment
Извините, что снова беспокою, все работает. Но я пробую более продвинутые вещи, и сейчас я совершенно потерян. Я добавил больше информации в вопрос. Я был бы признателен, если бы вы могли помочь. Благодарю вас! - person Artem Nazarenko; 25.06.2019
comment
Спасибо, вы мне очень помогли, отличное решение! - person Artem Nazarenko; 26.06.2019