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 のより大きなデータセットに影響を与えますか? ネットワーク通信に関しては、最適です。