我正在尝试完成一项非常常见的任务。我在 Neo4J 数据库中有大量数据集,并且希望通过 RESTful Web 服务以 25 个节点的块形式返回数据。我的模型非常简单:
(:Tenant {Hash:''})-[:owns]->(:Asset {Hash:'', Name:''})
我对Hash
两个标签上的属性。
如果我想获取第 101 个数据页,我的密码查询将如下所示:
MATCH (:Tenant {Hash:'foo'})-[:owns]->(a:Asset)
RETURN a
ORDER BY a.Hash
SKIP 2500
LIMIT 25
我的数据集由一个租户组成,拥有约 75K 资产。上述查询大约需要 30(!) 秒才能完成。我还注意到,我在数据中前进得越远(即越高SKIP
) 查询返回所需的时间越长。
我很快发现我的性能问题的罪魁祸首是ORDER BY a.Hash
。当我删除它时,查询返回亚秒级结果。这实际上是相当令人惊讶的,因为我希望索引本身也被排序。
显然,为了实现合理的分页,我必须有一致的排序顺序。
- 关于执行此查询有什么建议吗?
- 分页的替代建议?我可以看到添加专用页面节点,但这将变得难以维护。
- 无论如何,默认的排序顺序是什么,它是否一致?
嘿@GeoffreyBraaf 本周找到了一些时间来查看您的问题,您是对的,存在一些实施问题导致了不必要的缓慢。
我按照 Timmy 的建议实现了一个 Java 版本,该版本在 30 毫秒内完成。 Cypher 版本花了 100 秒。在 Cypher 中实现 top-n select 将其大幅改进了 600 倍。因此,Cypher 现在该查询大约需要 150 毫秒。
See: https://gist.github.com/jexp/9954509 https://gist.github.com/jexp/9954509
该工作已合并到 2.0-maint 中,并将作为 2.0.2 的一部分发布
See: https://github.com/neo4j/neo4j/pull/2230 https://github.com/neo4j/neo4j/pull/2230
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)