Cypher:Neo4j中的随机节点匹配
问题描述:
我有一个拥有3.4百万个节点的数据库,并且希望选择一个随机节点。Cypher:Neo4j中的随机节点匹配
我尝试使用类似
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