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

时间:2012-02-20 16:55:28

标签: neo4j random-sample gremlin

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

1 个答案:

答案 0 :(得分:2)

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

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

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

Take n random elements from a List<E>?