Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

neo4j: Is there a way/how to select random nodes?

Tags:

neo4j

cypher

I would like to retrieve a specific number of random nodes. The graph consists of 3 000 000 nodes where some of them are sources, some are target and some are both.

The aim is to retrieve random sources and as I don't know how to select random, the program generates k random numbers from 1 to 3 000 000 which represent node IDs and then discards all randomly selected nodes that are not sources. As this procedure is time-consuming, I wonder whether it is possible to directly select random sources with cypher query.

In case to select all sources, the query would be the following

START t=node(*) MATCH (a)-[:LEADS_TO]->(t) RETURN a

Does anyone know how would it be possible to select the limited number of random nodes directly with a cypher or, if not possible, suggest any workaround?

like image 501
Niko Gamulin Avatar asked Sep 20 '12 10:09

Niko Gamulin


2 Answers

You can use such construction:

MATCH (a)-[:LEADS_TO]->(t) 
RETURN a, rand() as r
ORDER BY r

It should return you random set of object.

Tested with Neo4j 2.1.3

like image 125
Lukasz Stelmach Avatar answered Sep 30 '22 03:09

Lukasz Stelmach


You can limit your query with skip/limit so you could do

START t=node(*) 
MATCH (a)-[:LEADS_TO]->(t) 
RETURN a
SKIP {randomoffset} LIMIT {randomcount} 

Otherwise you can also create a set of random node-id's and pass them as parameter to the cypher statement.

like image 28
Michael Hunger Avatar answered Sep 30 '22 04:09

Michael Hunger