2017-01-04 14 views
0

特定のタイプのすべてのノードを返すクエリがあります。私は全体のセットに均等に分布している10の結果しか戻そうとしていません。neo4j:結果の全長に基づいて結果をスキップする方法はありますか

私が試した:

$START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name 
SKIP toInt(count(image.name)/10); 

をしかし、これは私がSKIPの変数を使用することはできませんよというエラーメッセージを返します。

私はその後、カウント機能で文全体を試してみて、再実行ができることを考えた:

START t=node(*) 
MATCH (image:Image) RETURN image.name ORDER BY image.name 
SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10); 

しかし、これは無効な入力エラーを返します:

Invalid input 'R': expected whitespace, comment, '.', node labels, '[', "=~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*', '/', '%', '+', '-', '=', "<>", "!=", '<', '>', "<=", ">=", AND, XOR, OR, ',' or ')' (line 3, column 38 (offset: 112)) 
"SKIP toInt(count(MATCH (image:Image) RETURN image.name)/10);" 
            ^
+0

10個の結果しか返さない場合は、なぜ「LIMIT 10」を使用しないのですか? –

+0

@GaborSzarnyas limit 10は最初の10を返すだけで、すべての画像が時間順にソートされ、等距離から10サンプルを取得したい(つまり、セット内に50個の画像がある場合は、 – user3297011

+0

よろしくお願いします。次の質問:どのバージョンを使用していますか? Neo4j 2.0以降では、 'START'節は必要ありません(あなたは' t'の値をとにかく使用しません)。 –

答えて

0

あなたは結果をcollectことができリストから10個の要素を返します。

MATCH (image:Image) 
WITH image.name AS imageName 
ORDER BY imageName 
WITH COLLECT(imageName) AS imageNames, range(0, 10) AS indices 
UNWIND indices AS index 
RETURN imageNames[toInt(length(imageNames) * index/10)] 

Toインデックスを取得すると、10個の数字(0、...、9)のリストを作成し、UNWINDは10個の別々の行を取得し、それらをインデックスに分散します。

このクエリは、サーバーがすべての結果を計算して収集する必要があるため効率的ではありませんが、結果セットには10​​行しか含まれません。

(注:クエリはテストしていません)

関連する問題