目前我有50 000个Book节点((Book {views:1, likes:1})
),每本书都有属性likes
和views
。我每10分钟更新一次这些计数器,但是每次更新我都会创建新节点((:Update {time:timestamp(), views: 1, likes: 1)
)并将其与书籍(:Update)-[:UPDATED]->(:Book)
相关联。我想这样做是因为我想展示一个视觉呈现观看和喜欢的时间如何变化。
我将视图和喜欢存储为属性,因为此数据来自第三方来源,而我无法(:User)-[:READ]->(:Book)
。
我正在努力想出一个更好的处理视图和喜欢更新的解决方案。更新每10分钟发生一次,我的图表增长非常快。查询类似于上个月的更新'变得非常慢,因为如果Cypher查询where子句与范围运算符>一起使用,则Neo4j不使用索引。或者<。
示例查询1 。它需要2秒才能完成,因为它有超过一百万次的数据库命中。
MATCH (u:Update)-[r:UPDATED]->(b:BOOK)
WITH b, count(r) as totalUpdates
RETURN b.id, totalUpdates
ORDER BY totalUpdates
DESC LIMIT 5
示例查询2 。需要很长时间,根本不可用
MATCH (u:Update)-[r:UPDATED]->(b:Book)
WHERE u.time<1448928000000 AND u.time>1446336000000
RETURN b, collect(u) AS updates
我一直在寻找数据建模解决方案来解决这个混乱,我找不到任何东西。现在我对Neo4j是否是一个糟糕的选择感到困惑,或者我可能需要更多的CPU能力来处理它,或者有更好的方法来构建这样的图形。
非常欢迎任何有用信息的建议或链接!谢谢。