Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher分页列表查询优化_Neo4j_Cypher_Graph Databases - Fatal编程技术网

Neo4j Cypher分页列表查询优化

Neo4j Cypher分页列表查询优化,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,我们在Neo4j数据库中有以下数据模型。 标签为Post的节点和用户为的节点 Post和User之间的关系是(Post)-[:POSTED\u BY]->(User)。它表示某个帖子是由给定用户创建的 在Post节点上,有一个名为sort\u order的属性,它给出了检索Post节点的顺序。排序顺序是唯一的和索引支持的;在模式中强制执行唯一约束 在列表请求中,我需要按排序顺序获取给定用户的帖子,并以10页为单位(例如) 根据,计划器将跳过订单操作,因为节点已基于所选属性的索引排序。这将根据所选

我们在Neo4j数据库中有以下数据模型。 标签为Post的节点和用户为的节点

PostUser之间的关系是(Post)-[:POSTED\u BY]->(User)。它表示某个帖子是由给定用户创建的

在Post节点上,有一个名为
sort\u order
的属性,它给出了检索Post节点的顺序。
排序顺序是唯一的索引支持的;在模式中强制执行唯一约束

在列表请求中,我需要按
排序顺序
获取给定用户的帖子,并以10页为单位(例如)

根据,计划器将跳过订单操作,因为节点已基于所选属性的索引排序。这将根据所选页面大小限制完成查询所需的数据库点击次数和时间。这完全适用于此类查询:

MATCH (post:Post)
where post.sort_order > 0
return post
order by post.sort_order desc
limit 10
如果给出提示
post.sort\u order>0

一旦我需要由给定的用户检索帖子,查询将获取与所选用户相关的所有帖子节点,并在内存中对它们进行排序,然后返回当前页面(共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

Cypher planner可能(使用服务器的DB统计数据)确定,通过查找
用户
节点(希望您有一个
:User(id)
索引来帮助),获取其相关的
Post
节点,执行您的上一次查询通常更有效,然后分类


如果您成功地迫使计划员使用您的
:Post(sort\u order)
索引,那么执行效率可能会低很多。这是因为查询仍然必须获取并评估(大概几乎)每个
Post

的相关
User
节点。您可以使用EXPLAIN/PROFILE评估性能,如下所述:是的,这听起来合乎逻辑。但是,如果一个用户节点连接了数千个Post节点,那么这两种方法在速度和内存方面都会很昂贵。对于给定用户节点的post节点的更好分页,是否有任何建议?