如何计算Neo4j中浮点值的等级? [英] How to calculate rank for float values in Neo4j?
问题描述
我正在使用apoc.algo.dijkstra计算一组路径.我的目标是为每个建议的路径分配一个等级.重要的是节点之间的所有权重都是浮点数.密码:
I am calculating a set of paths using apoc.algo.dijkstra. My goal is to assign a rank to each of the suggested paths. Important is all the weights among nodes are floats. 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查询中执行此操作.
How can I do this inside the Cypher query.
注意:我已经阅读了有关计算排名的文章,但是不适合我的具体情况.
Note: I already read the post related to calculating the rank, but it doesn't suit to my specific case.
谢谢!
其他信息: 我现在尝试将等级和权重值与原点和路径合并.我可以成功地将此作为来源:
Additional info: I am trying now to merge the ranking and wight values with origin and path. I could succesully do this for origin:
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
然后我得到以下结果(这对我来说很令人满意):
Then I get the following result (which is satisfying for me):
{"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}
但是当我尝试合并"path"参数时,我遇到了麻烦.我认为,我对这些东西补偿过高.我想实现的目标是:
But when I am trying to merge "path" parameter, I am getting into trouble. I think, I overcompensate the things. Something what I would like to achieve is:
{"origin": {....}, "path": {...}, "rank": 1,"weight": 0.0}
这需要与特定的原始节点有关,如果我对第一个原始节点有3条路径建议,则需要将它们组合在一起.我已经尝试过,但是无法按我的意愿进行操作:
And this need to be related to a particular origin node, if I have 3 paths suggestions for the first origin, they need to be combined together. What I#ve tried, but it doesn't work as I want is:
...
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
如果您能提供帮助,我将不胜感激.
I would appreciate, if you could help.
推荐答案
这可能对您有用:
...
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;
结果(假设您的样本数据)如下:
The result (assuming your sample data) would look like this:
╒════════════════════════════════╕
│"res" │
╞════════════════════════════════╡
│{"rank":1,"weight":1.2344332423}│
├────────────────────────────────┤
│{"rank":2,"weight":0.9144331653}│
├────────────────────────────────┤
│{"rank":3,"weight":0.8432423321}│
└────────────────────────────────┘
[更新]
如果您还希望返回origin
和path
(并按升序排列),请参见此答案.
If you want to also return the origin
and path
(and rank by ascending weight), see this answer.
这篇关于如何计算Neo4j中浮点值的等级?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!