[英]Cypher: Match random node in Neo4j
我有一个包含340万个节点的数据库,并且想要选择一个随机节点。
我尝试使用类似
MATCH (n)
WHERE rand() <= 0.01
RETURN n
LIMIT 1
但是似乎算法总是从相同的节点开始,并选择随机数低于0.01的第一个节点,这意味着在大多数情况下,“随机”节点是前100个检查的节点之一。
是否有更好的查询来选择我所有节点中的一个完全随机的节点?
您可以从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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.