如何使用Gremlin从Neo4j获得随机样本?

如何使用Gremlin从Neo4j获得随机样本?,neo4j,random-sample,gremlin,Neo4j,Random Sample,Gremlin,我正在尝试使用Gremlin从Neo4j中提取节点的随机样本。在四处寻找之后,我找不到合适的方法来做这件事 我通过RESTAPI使用Neo4j 我的理想查询如下: resultset.sample(50) ratio = (50 / resultset.count()) * 1.25 resultset.random(ratio) 显然,没有这样的方法。四处搜索,我发现.random()只会发出随机节点。我想做这样的事情: resultset.sample(50) ratio = (50

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

我通过RESTAPI使用Neo4j

我的理想查询如下:

resultset.sample(50)
ratio = (50 / resultset.count()) * 1.25
resultset.random(ratio)
显然,没有这样的方法。四处搜索,我发现.random()只会发出随机节点。我想做这样的事情:

resultset.sample(50)
ratio = (50 / resultset.count()) * 1.25
resultset.random(ratio)
我们的目标是得到一个大致相同大小的随机集,但还有一些结果。从调用脚本中,我将洗牌并选择前50个。但是,这也不起作用,因为计数后resultset为空

我还考虑过获得固定比率和子集,但如果不进行洗牌,最后一个节点被占用的机会较小,我希望避免发送超过需要的数据

我还可以将结果集填充两次,一次用于计数,一次用于筛选。然而,这似乎并不正确

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

编辑:(基于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的较大数据集产生影响?就网络通信而言,这是最佳选择。

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

MyHelper.getRandomSampleFromList(my.particular.traversal.toList())
由于您不知道遍历将返回多少结果,因此无法获得预先确定的样本大小。MyHelper.getRandomSampleFromList(列表列表)的外观如下所示:

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

这就是我一直试图做的。你提到的另一个问题确实提到了收藏。shuffle(),因此,如果我能设法使用它,它将部分解决问题。我只需采样一个比我需要的大得多的比率,仍然不会将所有内容发送到其余部分。我将就此与您联系。我更新了问题,以便留下更完整的答案供将来参考。有任何意见吗?非常感谢您的帮助。