How to calculate a rank in Neo4j

page rank neo4j
neo4j graph algorithms
pagerank algorithm
neo4j topological sort
neo4j detect cycle
neo4j community detection
neo4j graph algorithms version
neo4j minimum cut

I am having two types of nodes (game & player) and one relationship (PLAYED). PLAYED relationship is having a property 'points'. Sample Data: Player (309274) scored 10 points Player (309275) scored 20 points Player (309276) scored 30 points Player (309277) scored 40 points Player (309278) scored 50 points I want to calculate a rank of a Player 309278 i.e. 5 from the cypher query. Can anybody help me here to generate cypher query?


MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN p.name
ORDER BY pl.score desc

then the row-number is your rank, which your client can compute easily

to access a certain rank:

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
RETURN p.name
ORDER BY pl.score desc
SKIP 4 LIMIT 1

to compute the rank, you'd probably, do something like this (not efficient):

MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}})
WITH p,pl
ORDER BY pl.score desc
// create a a collection
WITH collect(p) as players
UNWIND reduce(acc=[],idx in range(0,size(players)-1) | 
                     acc + [idx+1,players[idx]]) as player_rank
RETURN player_rank

Query help - newbie - calculating rank order - Cypher, Hello Community. I need some help to build the following query. Wondering what I am doing wrong. I have a relationship between (a) and (b)  then the row-number is your rank, which your client can compute easily. to access a certain rank: MATCH (p:Player)-[pl:PLAYED]->(:Game {id:{game-id}}) RETURN p.name ORDER BY pl.score desc SKIP 4 LIMIT 1 to compute the rank, you'd probably, do something like this (not efficient):


Based on Michael Hunger's answer, the following query computes the rank and returns the player and their rank on the same row instead of on alternating rows:

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

The way it works is that after ordering the players by their score, then - for each player p2 - it counts the number of players that scored higher, which equals p2's 0-based rank.

The caveat is that, with a complexity of O(n²), it's very inefficient if the number of players is large. The advantage is that it allows for further processing of the rank in relation to the player, e.g. store their rank on the relationship:

SET pl2.rank = 1 + size(filter(x in players where pl2.score < x.score))

which can be queried later on without the need for futher calculations:

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

5.1. The PageRank algorithm - Chapter 5. Centrality , PageRank is named after Google co-founder Larry Page, and is used to rank websites in Google's search The damping factor of the PageRank calculation. It can be computed by either iteratively distributing one node’s rank (originally based on degree) over its neighbours or by randomly traversing the graph and counting the frequency of hitting each node during these walks. PageRank is a variant of Eigenvector Centrality.


I am answering this years later because I found myself needing a similar query and solved it with one of the functions in the fantastic APOC plugin— apoc.coll.indexOf.

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
;

If you have a large collection, you can append LIMIT N to the end of the query to get just the top N. I just ran this query on a collection of ~172k nodes and it only took just over 3 minutes to run (with Neo4j 3.5.7 and APOC 3.5.0.4 on a MacBook running MacOS version 10.14.6 with 3.1 GHz i7 and 16GB of RAM); obviously YMMV.

I hope that this helps someone looking for how to calculate ranks in Neo4j!

Graph Algorithms in Neo4j: PageRank, All other centrality algorithms we discuss measure the direct influence is computed by either iteratively distributing one node's rank (originally  PR_W (p) is the weighted pageRank of P. Here, W (P1.P) denotes the weight of edge from P1 to P, while ΣW (P1) is the total weight of all outgoing edges from P1. If this looks overwhelming to you,


5.2.1. Page Rank - 5.2. Centrality algorithms, This section describes the Page Rank algorithm in the Neo4j Graph Data Science library. The damping factor of the Page Rank calculation. maxIterations. Hello graph-algorithms-team, I'm trying to develop a recommendation engine with python (django) and neo4j. Now I've found your package and I like it very much! The documentation is great and intuitive but I'm missing an example for perso


Running Competition, sufficient information to calculate the points earned at the race. This approach allows to enter the data immediately after the race and discuss the new ranking  In this post, I will show how the PageRank algorithm, originally developed by Google to rank webpages, and Neo4j can be used to rank the all-time best fighters in each UFC weight division. Getting the data


9.2.1. The ArticleRank algorithm - 9.2. Centrality algorithms, The damping factor of the PageRank calculation. weightProperty. string. null. yes. The property name that contains weight. If null, treats the graph as unweighted. Graph Algorithms in Neo4j: PageRank Mark Needham & Amy E. Hodler , Neo4j Jan 22, 2019 4 mins read Graph algorithms provide the means to understand, model and predict complicated dynamics such as the flow of resources or information, the pathways through which contagions or network failures spread, and the influences on and resiliency of groups.