2016-04-04 12 views
1

一連のものから好きなものまで、どのようなものが好きなのか、どのように多くのユーザーがいるかを知りたい。Neo4j Cypherの最適化

インデックスは、userIdプロパティのUserラベル、およびStuffToLikeラベルとそのstuffIdプロパティに存在します。

{ユーザー}と{stuff}の両方のパラメータは、IDを持つ配列を受け取ります。 この段階では、{ユーザー}配列は100〜1,000,000の文字列を保持し、{stuff}配列は100文字列を保持します。

これは、この時点までのDBヒット数が最も少ない、最も単純で最速のソリューションです。

MATCH (u:User) WHERE u.userId IN {users} 
    MATCH (n:StuffToLike) WHERE n.stuffId IN {stuff} 
    OPTIONAL MATCH (n)<-[l:LIKES]-(u) 
    OPTIONAL MATCH (n)<-[d:DISLIKES]-(u) 
    RETURN { 
     stuffId: n.stuffId, 
     name: n.name, 
     likes: count(l), 
     dislikes: count(d) 
    } AS stuff 

私はこのデータ量は(まだ)のリアルタイム使いやすさを期待していないが、私は妥当な時間でこれを実行することができれば、それは素晴らしいことです。

答えて

1

これを試すことができますか?

MATCH (u:User) WHERE u.userId IN {users} WITH collect(u) as users 
MATCH (n:StuffToLike) WHERE n.stuffId IN {stuff} 
RETURN { 
     stuffId: n.stuffId, 
     name: n.name, 
     likes: size([u in users WHERE (n)<-[:LIKES]-(u)]), 
     dislikes: size([u in users WHERE (n)<-[:DISLIKES]-(u)]) 
    } AS stuff 

はまた、この方法に高速です:

MATCH (u:User) WHERE u.userId IN {users} WITH collect(u) as users 
MATCH (n:StuffToLike) WHERE n.stuffId IN {stuff} 
RETURN { 
     stuffId: n.stuffId, 
     name: n.name, 
     likes: size((n)<-[:LIKES]-()), 
     dislikes: size((n)<-[:DISLIKES]-()) 
    } AS stuff 
+0

ありがとうございました。 dbのヒット数が大幅に減り、やや速くなります。サーバーの負荷が低いときは、より大きなセットに対して実行します。 2番目のクエリに表示されるStuffToLikeの全体的な人気はかなり速いです。そのユーザーの変化するセットの中から人気を眺めるだけでは本当に減速します。 – manonthemat