2017-07-07 251 views
2

我有一个拥有3.4百万个节点的数据库,并且希望选择一个随机节点。Cypher:Neo4j中的随机节点匹配

我尝试使用类似

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

,但它似乎像算法总是以相同的节点开始,并选择第一个它的随机数低于0.01,这意味着在大多数情况下,“随机”节点是前100个被检查节点之一。

是否有更好的查询,选择一个完全随机的我的所有节点?

回答

0

您可以从rand()函数生成随机ID并将其乘以节点数。这通常应该返回一个更随机的节点。

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

一旦有你的节点中创建了一些空间(即他们不再因删除完全连续的),你可能会错过一些在这里和那里。在这种情况下,你总是可以在任何一边范围内随机数+/-几个并返回结果的第一行。

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