2016-04-04 49 views
1

从一组喜欢的东西,我想找出有多少用户喜欢什么东西。Neo4j密码优化

UserId属性的User标签上存在索引,StuffToLike标签及其stuffId属性也存在索引。

{users}和{stuff}参数都将接收带有ID的数组。 对于这个阶段,{users}数组将保存100到1,000,000个字符串,而{stuff}数组将包含100个字符串。

这是最简单和最快的解决方案,至少有数据库点击直到这一点。

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

谢谢。数据库命中率明显降低,速度稍快。当服务器上的负载较低时,我会针对较大的一组运行它。第二个查询中显示的StuffToLike的总体流行度相当快。如果仅仅从不断变化的用户群中观察受欢迎程度,它确实会变慢。 – manonthemat