Cypher:在Neo4j中匹配随机节点

时间:2017-07-07 20:14:33

标签: random neo4j cypher graph-databases

我有一个拥有3.4百万个节点的数据库,并希望选择一个随机节点。

我尝试使用像

这样的东西
MATCH (n) 
WHERE rand() <= 0.01
RETURN n 
LIMIT 1

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

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

1 个答案:

答案 0 :(得分: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