Posts Tagged ‘Neo4j’

GraphDB Leaderboard

Friday, August 9th, 2013

Neo4j 2.0 introduces node labels. Here’s a quick example showing how labels work using Cypher. We’re going to create a
track and a few drivers that have raced.

Create the Track record

CREATE (n:Track {name: 'International Raceway'});

Create the Driver records

CREATE (n:Driver {name: 'Driver 1'});
CREATE (n:Driver {name: 'Driver 2'});
CREATE (n:Driver {name: 'Driver 3'});
CREATE (n:Driver {name: 'Driver 4'});
CREATE (n:Driver {name: 'Driver 5'});

Add track time result to the driver

MATCH d:Driver, t:Track
WHERE = 'Driver 1' AND = 'International Raceway'
CREATE d-[:RESULT {time: 140}]->t;

Here’s how a Cypher query is executed in plain english:


Assign d to Driver

Assign t to Track


This works like regular SQL, so basically we are doing where driver name is Driver and track name is International Raceway


Create a relationship with the time result, and link it to driver and the track

*Time is stored in seconds

Here’s how relationships are created and we’re adding the rest of the lap times.

MATCH d:Driver, t:Track
WHERE = 'Driver 2' AND = 'International Raceway'
CREATE d-[:RESULT {time: 122}]->t;

MATCH d:Driver, t:Track
WHERE = 'Driver 3' AND = 'International Raceway'
CREATE d-[:RESULT {time: 92}]->t;

MATCH d:Driver, t:Track
WHERE = 'Driver 4' AND = 'International Raceway'
CREATE d-[:RESULT {time: 122}]->t;

MATCH d:Driver, t:Track
WHERE = 'Driver 5' AND = 'International Raceway'
CREATE d-[:RESULT {time: 89}]->t;

1:06 – 66
1:29 – 89
1:32 – 92
1:46 – 106
2:02 – 122

Create the Leaderboard

To create the leaderboard, we execute the following query which hands us our driver’s quickest lap times in ascending order,
listing the fastest driver first.

MATCH driver-[r:RESULT]-track
WHERE = 'International Raceway'
WITH distinct as name, r.time as time
RETURN name, min(time)
ORDER BY min(time);
==> +---------------------------+
==> | | min(r.time) |
==> +---------------------------+
==> | "Driver 1"  | 66          |
==> | "Driver 5"  | 89          |
==> | "Driver 3"  | 92          |
==> | "Driver 4"  | 122         |
==> | "Driver 2"  | 122         |
==> +---------------------------+

Finding all the results

If we want to see all of the times posted by our drivers, we would execute the following:

MATCH driver-[r:RESULT]-track
WHERE = 'International Raceway' 
RETURN, r.time
ORDER BY r.time

Even though this is a simple example, it shows how to set up a graph to represent your data, set up relationships and
query against that data to provide a leaderboard and a listing of all of the driver times.