我正在尝试使用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的大型数据集有影响吗?就网络通信而言,它是最佳的。
答案 0 :(得分:2)
鉴于您需要特定计数,您可以生成一个列表,然后对该列表进行采样。例如:
MyHelper.getRandomSampleFromList(my.particular.traversal.toList())
鉴于您不知道您的遍历将返回多少结果,您无法获得预定的样本大小。您的MyHelper.getRandomSampleFromList(列表列表)将如下所示: