2

我正在尝试使用 Gremlin 从 Neo4j 中提取随机节点样本。在四处寻找之后,我找不到合适的方法来做到这一点。

我通过 REST API 使用 Neo4j。

我理想的查询是这样的:

resultset.sample(50)

显然,没有这样的方法。环顾四周,我发现 .random() 只会发出随机节点。我想过做这样的事情:

ratio = (50 / resultset.count()) * 1.25
resultset.random(ratio)

目标是获得一个大小大致相同但结果更多的随机集。从调用脚本中,我会对其进行洗牌并选择前 50 个。但是,这也不起作用,因为结果集在计数后为空。

我还考虑过获得一个固定比率并获得一个子集,但如果没有洗牌,最后一个节点被占用的机会就会更小,我想避免发送比需要更多的数据。

我还可以将结果集填充两次,一次计数,一次过滤。然而,这似乎不对。

什么是获得随机样本的好方法?

编辑:(基于 Marko A. Rodriguez 的评论

我想出了以下内容:

nodes = ... some expression ...
candidates = nodes.toList()
Collections.shuffle(candidates)

size = 50
if (candidates.count() >= size) {
    return candidates[0..(size-1)]; 
} else {
    return candidates;
}

我发现最后一个条件有点烦人,但是如果条目较少,切片就会失败。

另外,这对 Neo4j 的更大数据集有影响吗?就网络通信而言,它是最佳的。

4

1 回答 1

2

鉴于您需要特定计数,您可以生成一个列表,然后对该列表进行采样。例如:

MyHelper.getRandomSampleFromList(my.particular.traversal.toList())

鉴于您不知道遍历将返回多少结果,因此您无法获得预定的样本量。您的 MyHelper.getRandomSampleFromList(List list) 将如下所示:

从 List<E> 中取 n 个随机元素?

于 2012-02-21T23:12:36.497 回答