【问题标题】:Cypher: Match random node in Neo4jCypher:匹配 Neo4j 中的随机节点
【发布时间】:2017-07-07 20:14:32
【问题描述】:

我有一个包含 340 万个节点的数据库,想随机选择一个节点。

我尝试使用类似的东西

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

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

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

【问题讨论】:

    标签: random neo4j cypher graph-databases


    【解决方案1】:

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

    【讨论】:

    • 如果我想匹配一个从特定类型中随机选择的节点呢?例如随机选择一部电影?
    • 我会将 :Movie 添加到匹配语句 MATCH (n:Movie)... 中,并增加过去的偏移量,直到我开始在随机电影中获得一致的点击率。
    • ID 值可能是分布的或完全随机的
    • 是的,它们可能是集群的、分布式的,有些是集群的,有些是分布式的,谁知道呢。你可以做一些采样并对:Movie 进行全表扫描,看看你有什么可以给你一些想法。你可以给每部电影某种标识符并随机化那个名字......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多