Cypher:匹配Neo4j中的随机节点

8yoxcaq7  于 2023-04-20  发布在  其他
关注(0)|答案(2)|浏览(222)

我有一个拥有340万个节点的数据库,想随机选择一个节点。
我试过用类似

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

但是看起来该算法总是从相同的节点开始,并且选择随机数低于0.01的第一个节点,这意味着在大多数情况下,“随机”节点是前100个被检查的节点之一。
有没有更好的查询,从所有节点中选择一个完全随机的节点?

ds97pgxw

ds97pgxw1#

您可以从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
nhn9ugyo

nhn9ugyo2#

这是可行的,在连续运行时返回变化。尽管340万个节点的查询性能可能是可以接受的,也可能是不可接受的。

MATCH (n)
RETURN n
ORDER BY RAND()
LIMIT 1

相关问题