2017-07-07 7 views
2

私は3.4百万のノードを持つデータベースを持っており、ランダムなノードを選択します。Cypher:Neo4jのランダムノードと一致

私は

MATCH (n) 
WHERE rand() <= 0.01 
RETURN n 
LIMIT 1 

のようなものを使用してみましたが、アルゴリズムは常に同じノードで開始し、ほとんどの場合、「ランダム」ノードを意味し、その乱数0.01を下回っている最初のものを、選択のように思えます最初の100個のチェックノードの1つです。

すべてのノードのうち完全にランダムなものを選択すると、より良いクエリがありますか?

答えて

0

rand()関数からランダムIDを生成し、それにノード数を掛けることができます。これは一般に、よりランダムなノードを返すべきです。あなたのノード内で作成されたいくつかのスペースがあるいったん

MATCH (n) 
WHERE id(n) = toInteger(rand() * 3400000) 

(すなわち、彼らはもはや削除のために完全に連続している)あなたがここにあるいくつかを逃すかもしれません。その場合は、いつでも乱数の範囲を+/-少しずつ変えて、結果の最初の行を返すことができます。

WITH toInteger(rand() * 3400000) AS rand_node, 5 AS offset 
WITH range(rand_node - offset, rand_node + offset) AS rand_range 
MATCH (n) 
WHERE id(n) IN rand_range 
RETURN n 
LIMIT 1 
関連する問題