2

Gremlin を使用して、Neo4j からノードのランダム サンプルを抽出しようとしています。いろいろと調べてみたところ、適切な方法が見つかりませんでした。

REST API 経由で Neo4j を使用します。

私の理想的なクエリは次のようなものです。

resultset.sample(50)

明らかに、そのような方法はありません。周りを検索すると、ランダム ノードのみを出力する .random() が見つかりました。私はこのようなことを考えました:

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

目標は、ほぼ同じサイズのランダムなセットを取得することでしたが、いくつかの結果が得られました。呼び出しスクリプトから、それをシャッフルして最初の 50 を選択します。ただし、結果セットがカウント後に空であるため、これも機能しません。

固定比率を取得してサブセットを取得することも検討しましたが、シャッフルがないと、最後のノードが取得される可能性が低くなり、必要以上のデータを送信することは避けたいと考えています。

結果セットを 2 回入力することもできます。1 回はカウント用、もう 1 回はフィルタリング用です。しかし、それは正しくないようです。

ランダムなサンプルを取得する良い方法は何ですか?

編集: (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 に答える