我正在尝试使用 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 的更大数据集有影响吗?就网络通信而言,它是最佳的。