4

私はneo4jバージョン1.9M02で次の暗号クエリを実行しようとしています

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN products._id
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

私は、関係の作成時間順に注文された、私の友人によって追加または在庫されているが、私によって追加または在庫されていないすべての製品を入手することを期待しています。このクエリは正しい結果を返しますが、products._idの値が重複しています(1人のユーザーが製品を追加し、他のユーザーがそれをストックしました)。しかし、私はこのproducts._idのインスタンスを1つだけ必要としているので、試してみました

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN DISTINCT products._id
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

(products._idのDISTINCTを追加しました)しかし、今回はUnknown identifier frエラーが発生しました。そこで、RETURNステートメントにfrを追加しました

START me=node(2)
            MATCH me-[:FOLLOWS]->friends
            ,friends-[fr:ADDED|STOCKS]->products
            ,me-[r?]->products
            WHERE r is null
            RETURN DISTINCT products._id,fr
            ORDER BY fr.CreatedOn DESC
            SKIP 0
            LIMIT 10

このクエリはエラーなしで機能しますが、以前と同じように重複する製品IDを返します。

私はここ数日neo4jで遊んでいるだけなので、専門家ではありません。誰かがここで私を助けてくれたら本当にありがたいです。

4

2 に答える 2

9

console.neo4j.orgで小さなケースを作成しました

次のクエリで、私は戻ってきます[4, 3, 2, 4, 3, 2, 4, 3 ,2]

START me=node(1) 
MATCH me-[:FOLLOWS]->friends
,friends-[fr:ADDED|STOCKS]->products
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id

最後の行に明確に置くと、私は戻ってきます[3, 4, 2]

START me=node(1) 
MATCH me-[:FOLLOWS]->friends
,friends-[fr:ADDED|STOCKS]->products
,me-[r?]->products 
WHERE r is null 
with distinct products._id as id, fr.CreatedOn as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN distinct id

注文がはっきりと失われているようです。

編集

これについてgithubに問題を提出した後、私が答えを得るまでに長い時間がかかりました。

答えの提案は、このクエリを実行することでした:

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product)
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

IDのみを返すようにクエリを変更しました。

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product 
WHERE not(me-->product) 
WITH product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 
RETURN id

そして出来上がり、それは戻ります[4, 3, 2](更新されたテストケースも作成しました。)

于 2012-12-26T00:00:14.080 に答える
0

集計関数MINを使用すると、最も早いCreatedOn日付を抽出できます。それができたら、次のように、最も早い日付で結果セットを注文するだけです。

START me=node(1) 
MATCH me-[:FOLLOWS]->friends-[fr:ADDED|STOCKS]->product, 
WHERE not(me-->product)
RETURN product._id as id, min(fr.CreatedOn) as CreatedOn 
ORDER BY CreatedOn DESC 

Hth、

アンドレ

于 2012-12-31T11:38:01.673 に答える