2012-02-20 22 views
2

Gremlinを使用してNeo4jからノードのランダムサンプルを抽出しようとしています。周りを検索した後、私はそれを行う適切な方法を見つけることができませんでした。Gremlinを使用してNeo4jからランダムサンプルを取得するにはどうすればよいですか?

私はNeo4jをREST API経由で使用しています。

resultset.sample(50) 

もちろん、そのような方法はありません。

私の理想的なクエリは、このようなものになるだろう。周囲を検索すると、.random()がランダムなノードだけを出力することがわかりました。目標は、ほぼ同じサイズのランダムなセットを取得することでしたが、いくつかのより多くの結果を

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

:私はこのような何かを考えました。呼び出し元のスクリプトから、私はそれをシャッフルして最初の50を選択します。しかし、これはカウントダウン後に結果セットが空であるためにも機能しません。

また、固定比率を取得してサブセットを取得することも考えましたが、シャッフルがないと、最後のノードのチャンスが少なくなり、必要以上にデータを送信したくありません。

また、結果セットを2回、1回カウントして1回フィルタリングすることもできます。しかし、それは正しいとは思わない。

ランダムサンプルを得るにはどうすればよいでしょうか?

編集:(マルコA.ロドリゲスのコメント

に基づいて、私は、次のを思い付いた:

nodes = ... some expression ... 
candidates = nodes.toList() 
Collections.shuffle(candidates) 

size = 50 
if (candidates.count() >= size) { 
    return candidates[0..(size-1)]; 
} else { 
    return candidates; 
} 

私は最後の条件は少し迷惑を見つけるが、それならばスライシングが失敗しました少数のエントリがあります。

また、これはのNeo4jのための大規模なデータセットに影響を与えるのでしょうか?限り、ネットワーク通信が行くように、それが最適である。

答えて

2

特定のカウントが必要な場合は、リストを生成してそのリストをサンプリングすることができます。たとえば、

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

トラバーサルが返される結果の数がわからない場合、所定のサンプルサイズを取得できません。

Take n random elements from a List<E>?

+0

これは私がやろうとしてきたものです:あなたのMyHelper.getRandomSampleFromList(一覧リスト)は次のようになります。あなたが指摘したもう1つの質問はCollections.shuffle()です。私がそれを使用することができれば、問題を部分的に解決できます。私は必要以上に大きな割合をサンプリングして、RESTのすべてを送信しません。私はこれであなたに戻ってきます。 –

+0

今後の参照のために、より完全な回答を残すために質問を更新しました。コメントはありますか?あなたの助けが大変ありがとうございます。 –

関連する問題