在Neo4j中构建复杂输出并对记录进行排名

在Neo4j中构建复杂输出并对记录进行排名,neo4j,cypher,neo4j-apoc,Neo4j,Cypher,Neo4j Apoc,这个问题与前一个帖子直接相关: 我正在尝试将秩和权重值与原点和路径合并。我可以成功地为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

这个问题与前一个帖子直接相关:

我正在尝试将秩和权重值与原点和路径合并。我可以成功地为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
然后我得到了以下让我满意的结果:

{"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
如果您能帮忙,我将不胜感激。

这应该可以:

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

谢谢你,你帮了我很多,神奇的解决方案!你已经帮了我很多,但我再次感到抱歉,如果你能看看,我将不胜感激:谢谢你,今天我解决了这个问题。我太累了,最后一个问题没有什么意义。我会移除它。如果我能不止一次投票支持你的回答,我会这样做。再次感谢你!