5

投稿と、投稿に「いいね」したユーザーを取得するタイムライン タイプのクエリがあります。

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriend
MATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, FILTER (x in collect(distinct likers) : x <> null), myfriend
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

取得する投稿の数を 25 に制限しています。また、投稿を気に入ったユーザーの数も制限したいと考えています。クエリで複数の制限句を使用する方法はありますか? 理想的には、次のようなことをしたいと思います。

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriendMATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, LIMIT FILTER (x in collect(distinct likers) : x <> null) 6, myfriend
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

または:

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend
WITH myfriendMATCH myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WHERE myfriend <> statusupdates
RETURN distinct statusupdates, FILTER (x in collect(distinct likers) : x <> null), myfriend
LIMIT likers 6
ORDER BY statusupdates.PostTime DESC
LIMIT 25; 

各投稿に対して返されるいいねの数を 6 に制限するのはどれですか。どうすればこれを達成できますか?

4

2 に答える 2

9

好きな人を制限することの問題は、それがクエリの反対側にあることです。そのため、それを最適化する方法はありません。基本的には 2 試合を行う必要があります。また、WITH の後の LIMIT は 1.9.M01 でのみ使用できます。

だから、私はこの種があなたが望むことをすると思います:

START me=node:node_auto_index(UserIdentifier='USER0')
MATCH me-[rels:FOLLOWS*0..1]-myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
WITH distinct likers
// you can also order by something here, if you want.
LIMIT 6
START me=node:node_auto_index(UserIdentifier='USER0')
// at this point, likers is already bound, so it's limited to the 6
MATCH me-[rels:FOLLOWS*0..1]-myfriend-[:POSTED*]-statusupdates<-[r?:LIKE]-likers
RETURN distinct statusupdates, likers, myfriend
ORDER BY statusupdates.postTime
LIMIT 25;

テストされていないコード。うまくいくといいのですが、次回はコンソールでサンプルを作成して、いろいろ試してみましょう。:)

于 2012-11-16T00:12:10.017 に答える
8

Neo4j 2.0 では、コレクション スライスを使用できます。つまり、次のようなクエリを実行できます

MATCH (n)-[r*0..1]-(x) RETURN n, LABELS(n), COLLECT([x,id(x),LABELS(x),r])[0..10] LIMIT 5

上記の例では、コレクション内にそれぞれ 0 ~ 10 個の関連ノードを持つ最大 5 個の n ノードが返されます。

于 2014-07-26T05:57:01.917 に答える