Graph 经常更新的Neo4j数据建模

Graph 经常更新的Neo4j数据建模,graph,neo4j,cypher,data-modeling,graph-databases,Graph,Neo4j,Cypher,Data Modeling,Graph Databases,目前我有50000个图书节点((图书{views:1,likes:1})),每本书都有属性likes和视图。我每10分钟更新一次这些计数器,但每次更新我都要创建新节点((:update{time:timestamp(),views:1,likes:1))并将其与书籍链接((:update)-[:UPDATED]->(:Book)。我之所以要这样做,是因为我想展示一个视觉演示视图和喜欢在时间内是如何变化的 我将视图和喜好存储为属性,因为这些数据来自第三方源,我无法执行(:User)-[:READ]

目前我有50000个图书节点(
(图书{views:1,likes:1})
),每本书都有属性
likes
视图
。我每10分钟更新一次这些计数器,但每次更新我都要创建新节点(
(:update{time:timestamp(),views:1,likes:1)
)并将其与书籍链接(
(:update)-[:UPDATED]->(:Book)
。我之所以要这样做,是因为我想展示一个视觉演示视图和喜欢在时间内是如何变化的

我将视图和喜好存储为属性,因为这些数据来自第三方源,我无法执行
(:User)-[:READ]->(:Book)

我正在努力找到一个更好的解决方案来处理视图和喜欢的更新。更新每10分钟发生一次,我的图表增长非常快。像“获取上个月的更新”这样的查询变得非常慢,因为如果将Cypher query where子句与范围运算符>或(b:Book)一起使用,Neo4j不会使用索引 其中美国时间1446336000000 返回b,收集(u)作为更新 我一直在寻找数据建模解决方案来解决这一混乱局面,但我找不到任何解决方案。现在我不知道Neo4j是否是一个不好的选择,或者我需要更多的CPU能力来处理它,或者有更好的方法来构造这样的图形


非常欢迎提供任何有用信息的建议或链接!谢谢。

您使用的是什么版本的Neo4j?范围查询现在使用从版本2.3开始的索引。使用
:schema
命令验证您在
Update.time
上有索引。感谢您的回复,非常感谢。在更新时添加索引。时间工作更快。Just测试了此查询匹配(b:Book)1444604400000和v,su按u排序。viewCount DESC和v,collect(b)[0]作为todaysUpdate返回b,b.viewCount-todaysUpdate.viewCount作为todays ORDER按todays DESC限制5排序,以获得前五名增长最快(趋势分析)书籍。花了17秒。仍然很长时间,我可以改进结构吗?或者我应该生成增长最快的书籍列表并缓存它吗?谢谢!如果时间范围查询是您的主要查询类型,您可以绘制时间维度而不是项目维度。您是否考虑过创建时间树并根据它们在该目录中的位置查询更新树而不是更新标签?在查询中,时间维度是一个过滤器(或者最多是一个索引查找)但是,如果这是您的主要查询类型,它看起来应该是您的域结构。如果您同时查询项目和时间维度,则可以同时记录这两个维度。您可以在同一个图形中存储数据的多个透视图,以服务于不同类型的查询。这太棒了!感谢@jjaderberg。将尝试安装、迁移通过使用它来查询数据并比较时间范围查询的性能。看起来很有希望您使用的是什么版本的Neo4j?范围查询现在使用从版本2.3开始的索引。使用
:schema
命令验证您在
Update.time
上有索引。感谢您的回复,非常感谢。在Update.time-wor上添加了索引ks更快。刚刚测试了此查询匹配(b:Book)1444604400000与v,su按u排序。viewCount DESC与v,collect(b)[0]作为todaysUpdate返回b,b.viewCount-todaysUpdate.viewCount作为todays ORDER按todays DESC LIMIT 5获得前5名增长最快(趋势)书籍。花了17秒。仍然很长时间,我可以改进结构吗?或者我应该生成增长最快的书籍列表并缓存它吗?谢谢!如果时间范围查询是您的主要查询类型,您可以绘制时间维度而不是项目维度。您是否考虑过创建时间树并根据它们在该目录中的位置查询更新树而不是更新标签?在查询中,时间维度是一个过滤器(或者最多是一个索引查找)但是,如果这是您的主要查询类型,它看起来应该是您的域结构。如果您同时查询项目和时间维度,则可以同时记录这两个维度。您可以在同一个图形中存储数据的多个透视图,以服务于不同类型的查询。这太棒了!感谢@jjaderberg。将尝试安装、迁移通过使用它来查询数据并比较时间范围查询的性能。看起来非常有前景
MATCH (u:Update)-[r:UPDATED]->(b:BOOK)
WITH b, count(r) as totalUpdates 
RETURN b.id, totalUpdates
    ORDER BY totalUpdates
    DESC LIMIT 5
MATCH (u:Update)-[r:UPDATED]->(b:Book)
WHERE u.time<1448928000000 AND u.time>1446336000000
RETURN b, collect(u) AS updates