2017-07-07 3 views
2

J'ai une base de données avec 3,4 millions de nœuds et je veux sélectionner un nœud aléatoire.Cypher: Correspond à un nœud aléatoire dans Neo4j

J'ai essayé d'utiliser quelque chose comme

MATCH (n) 
WHERE rand() <= 0.01 
RETURN n 
LIMIT 1 

, mais il semble que l'algorithme commence toujours avec les mêmes nœuds et sélectionne le premier dont le nombre aléatoire est inférieur à 0,01, ce qui signifie que dans la plupart des cas, le noeud « aléatoire » est l'un des 100 premiers nœuds vérifiés.

Y a-t-il une meilleure requête pour sélectionner un de mes nœuds complètement aléatoire?

Répondre

0

Vous pouvez générer un ID aléatoire à partir de la fonction rand() et le multiplier par le nombre de nœuds. Cela devrait généralement retourner un noeud plus aléatoire.

MATCH (n) 
WHERE id(n) = toInteger(rand() * 3400000) 

Une fois qu'il ya un espace créé au sein de vos noeuds (à savoir qu'ils ne sont plus parfaitement contiguës en raison de suppressions), vous risquez de manquer quelques-uns ici et là. Dans ce cas, vous pouvez toujours aligner le nombre aléatoire +/- quelques uns de chaque côté et retourner la première ligne du résultat.

WITH toInteger(rand() * 3400000) AS rand_node, 5 AS offset 
WITH range(rand_node - offset, rand_node + offset) AS rand_range 
MATCH (n) 
WHERE id(n) IN rand_range 
RETURN n 
LIMIT 1