Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算Neo4j中的秩_Neo4j - Fatal编程技术网

如何计算Neo4j中的秩

如何计算Neo4j中的秩,neo4j,Neo4j,我有两种类型的节点(游戏和玩家)和一种关系(已玩)。 播放的关系具有属性“点数”。 样本数据: 球员(309274)得了10分 球员(309275)得了20分 球员(309276)得了30分 球员(309277)得了40分 球员(309278)得了50分 我想从cypher查询中计算玩家的等级309278,即5。有人能帮我生成密码查询吗 MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}}) RETURN p.name ORDER BY

我有两种类型的节点(游戏和玩家)和一种关系(已玩)。 播放的关系具有属性“点数”。
样本数据:
球员(309274)得了10分
球员(309275)得了20分
球员(309276)得了30分
球员(309277)得了40分
球员(309278)得了50分

我想从cypher查询中计算玩家的等级309278,即5。有人能帮我生成密码查询吗

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN p.name
ORDER BY pl.score desc
那么行号就是你的排名,你的客户可以很容易地计算出来

要访问某个级别,请执行以下操作:

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN p.name
ORDER BY pl.score desc
SKIP 4 LIMIT 1
要计算排名,您可能会这样做(效率不高):

基于,以下查询计算排名并返回玩家及其在同一行而不是交替行上的排名:

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
WITH p, pl
ORDER BY pl.score desc
WITH collect(p) as players
MATCH (p2:Player)-[pl2:PLAYED]->(:Game {id:{game-id}})
RETURN p2, size(filter(x in players where pl2.score < x.score)) + 1
以后无需进一步计算即可查询:

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN pl.rank

我在几年后回答这个问题,因为我发现自己需要一个类似的查询,并用奇妙的
APOC
插件中的一个函数解决了它

如果您有一个较大的集合,您可以将
LIMIT N
附加到查询的末尾,以仅获取顶部的
N
。我刚刚在大约172k个节点的集合上运行了这个查询,只花了3分钟就完成了(在MacBook上运行的Neo4j 3.5.7和APOC 3.5.0.4版本是MacOS 10.14.6,具有3.1 GHz i7和16GB内存);显然是YMMV


我希望这有助于寻找如何在Neo4j中计算排名的人

今天我推荐neo4j图形算法,它在大小和硬件使用方面都是可伸缩的:
SET pl2.rank = 1 + size(filter(x in players where pl2.score < x.score))
MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN pl.rank
MATCH (p:Player)-[pl:PLAYED]->(g:Game)
WITH p, pl.score AS score
ORDER BY score DESC
WITH collect(p) AS players
UNWIND players AS player
RETURN player, apoc.coll.indexOf(players, player) + 1 AS rank  // zero-indexed
;