我们在Neo4j数据库中有以下数据模型。标记为后的节点和具有用户的节点
Post与用户之间的关系是(Post)-:Post_BY->(User)。它表示指定用户创建了一个post。
在Post节点上,有一个名为sort_order的属性,它给出了检索post节点的顺序。index-backed;是sort_order唯一的和,一个惟一的约束是在模式中强制的。
在清单请求中,我需要获得由sort_order命令的给定用户的帖子,页面为10 (例如)
根据Neo4j文档,计划器跳过订单操作,因为节点已经根据所选属性sort_order的索引进行排序。这限制了按所选页面大小完成查询所需的数据库命中次数和时间。这完全适用于这样的查询:
MATCH (post:Post)
where post.sort_order > 0
return post
order by post.sort_order desc
limit 10如果给出提示post.sort_order > 0。
一旦需要通过给定的用户检索帖子,查询将获取与在内存中对其排序的选定用户相关的所有Post节点,并返回当前页面( 10条记录)。分析了以下所需的查询后,它似乎忽略了索引。
MATCH (post:Post)-[:IN]->(user:User {id: 3})
where post.sort_order > 0
return post
order by post.sort_order desc
limit 10查询或数据模型中是否存在隐藏的问题?
或者,如果可以对查询、数据模型或索引进行优化。
使用的neo4j版本为3.5.23
发布于 2020-11-21 02:12:03
Cypher规划师可能会确定(使用服务器的DB统计信息),通常通过查找User节点(希望您有一个:User(id)索引来帮助执行)、获取相关的Post节点,然后进行排序,执行上一次查询的效率更高。
如果您成功地迫使规划师使用您的:Post(sort_order)索引,那么执行效率可能会低得多。这是因为查询仍然必须为(大概几乎)每个User获取和计算相关的Post节点。
https://stackoverflow.com/questions/64912100
复制相似问题