我有一个拥有340万个节点的数据库,想随机选择一个节点。我试过用类似
MATCH (n) WHERE rand() <= 0.01 RETURN n LIMIT 1
但是看起来该算法总是从相同的节点开始,并且选择随机数低于0.01的第一个节点,这意味着在大多数情况下,“随机”节点是前100个被检查的节点之一。有没有更好的查询,从所有节点中选择一个完全随机的节点?
ds97pgxw1#
您可以从rand()函数生成一个随机ID,并将其乘以节点数。这通常会返回一个更随机的节点。
rand()
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
nhn9ugyo2#
这是可行的,在连续运行时返回变化。尽管340万个节点的查询性能可能是可以接受的,也可能是不可接受的。
MATCH (n) RETURN n ORDER BY RAND() LIMIT 1
2条答案
按热度按时间ds97pgxw1#
您可以从
rand()
函数生成一个随机ID,并将其乘以节点数。这通常会返回一个更随机的节点。一旦你的节点中产生了一些空间(即,由于删除,它们不再是完全连续的),你可能会在这里或那里错过一些。在这种情况下,你可以总是在随机数+/-两侧的几个范围内,并返回结果的第一行。
nhn9ugyo2#
这是可行的,在连续运行时返回变化。尽管340万个节点的查询性能可能是可以接受的,也可能是不可接受的。