【问题标题】:Neo4j cypher query performance issue with movie recommendation query电影推荐查询的 Neo4j 密码查询性能问题
【发布时间】:2016-12-22 10:17:25
【问题描述】:

我目前正在处理一个电影推荐查询,该查询应该使用以下密码查询返回具有最大“推荐影响”的电影:

match (m:Movie) 
with m, size((m)<-[:LIKED]-(:User)-[:LIKED]->(:Movie)) as score
order by score desc
limit 10
return m.title, score

在阅读了 graphdb (neo4j) 电子书后,我假设这对于 neo4j 来说应该是一个简单的查询,但执行时间需要 32737 毫秒,这不是我所期望的。有没有人对这类查询有经验并且有任何提高性能的建议?或者这个查询是否应该表现良好,我是否需要做一些 neo4j / java 配置调整?

查询的概况:

结果:

【问题讨论】:

    标签: performance neo4j cypher


    【解决方案1】:

    也许这是你可以预先计算出来的。

    您的分数与每个用户喜欢的电影数量有关。为什么不计算并存储每个用户喜欢的电影数量(假设用户只能喜欢一部电影,而不是多次)?

    请注意,这只有在您只关心每个用户喜欢的电影数量并且可以将它们相加时才有意义,即使它们代表许多用户对同一部电影的多个喜欢。

    MATCH (u:User)
    SET u.likedCount = SIZE((u)-[:LIKED]->(:Movie))
    

    每次用户喜欢(或不喜欢)另一部电影时,您都需要更新它。

    为所有用户预先填充后,您的评分查询现在变为:

    MATCH (m:Movie)
    WITH m
    MATCH (m)<-[:LIKED]-(u:User)
    WITH m, SUM(u.likedCount) as score
    ORDER BY score desc
    LIMIT 10
    RETURN m.title, score
    

    编辑

    这当然包括来自相关电影的每个用户的喜欢。如果你真的需要考虑这一点,你需要调整你的:

    WITH m, SUM(u.likedCount) - count(u) as score
    

    如果您只想在评分中计算用户喜欢的不同电影,那么您无法预先计算并且必须使用类似 stdob-- 的答案。

    【讨论】:

    • 在这种特定情况下,预先计算似乎是可行的方法,因为实时语句至少需要 30 秒。我确实认为围绕 neo4j 图形数据库的营销有点误导,因为(在阅读了图形数据库书之后)我预计 neo4j 可以轻松处理这些实时查询。感谢您的帮助!
    • 我认为当查询考虑的子图达到数千万时,事情确实会变慢。对数据库中的每部电影(其中大约有 10k)进行这种查询与获取单个电影甚至少数电影的分数之间也存在差异,这可能会考虑数千个节点的子图,而不是超过数百万。
    【解决方案2】:

    试试这个查询:

    MATCH (M:Movie)<-[:LIKED]-(:User)-[:LIKED]->(R:Movie)
    WITH M, 
         size( collect(distinct R) ) as score
    RETURN M.title as title, 
           score 
    ORDER BY score DESC LIMIT 10
    

    作为一个选项:

    MATCH (M:Movie)<-[:LIKED]-(:User)-[:LIKED]->(R:Movie)
    RETURN M.title as title, 
           count(R) as score
    ORDER BY score DESC LIMIT 10
    

    【讨论】:

    • 这将 db 命中数从 44038477 移回 266085,但将执行时间从 30920 增加到 62125
    • 第二条语句(选项)耗时 54320,比我问题中的原始语句慢了 20 秒。还有其他建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多