gpt4 book ai didi

neo4j - 空间层插入性能差

转载 作者:行者123 更新时间:2023-12-02 03:30:11 26 4
gpt4 key购买 nike

所以我尝试将一些邮政编码和地址数据加载到 neo4j 中。我提出了一个独特的约束,实际上有三个标签。邮政编码、地址和地区。 REGION 和 POSTCODE 对其单一属性有独特的约束。我们用于插入的查询将 MERGE REGION,MERGE POSTCODE CREATE ADDRESS,然后是 CREATE RELATIONSHIPS。这个想法是为了能够看到哪个邮政编码在哪个地区,以及有多少地址共享一个邮政编码,因此 MERGE 行为很重要。

但是,我们发现一旦数据库达到相当适中的大小,这就会非常慢。现在我们预料到了这一点,但我们预计约束检查应按 log(n) 缩放。相反,性能与数据库的大小呈线性关系,这是非常出乎意料的。

enter image description here

在不放弃 MERGE 行为的情况下,我可以做些什么来改进它?这是 UNIQUE 约束的结果吗?理论上,在使用合并时,具有唯一约束和仅具有索引之间应该没有区别,因为只有一个属性。无论哪种方式合并都需要知道属性是否存在才能决定是否合并。

我知道我可以做各种事情来加快插入速度,使用 csv 加载器等。我对提高渐近性能感兴趣。我认为唯一约束的时间成本应该是 O(log(n)),而不是 O(n),这可能会产生巨大的差异。

编辑:进一步调查显示问题不是索引查找,而是 R 树插入空间层。用于插入的特定代码使用了嵌入式 API,而不是密码,以及代码片段:

graphDB.index().forNodes(s).add(node, "dummy", "variable");

随着树的大小扩展,在 O(n) 时逐渐变慢。这显然是 R 树的预期行为。这大约需要 0.0005 * 层中的节点数。删除空间插入后,它的速度提高了几个数量级,并且没有显示缩放行为。我假设减少只是因为缓存在启动后预热。

enter image description here

顺便说一句,我正在使用以下代码来启动空间索引:

Map<String, String> config = SpatialIndexProvider.SIMPLE_POINT_CONFIG;
Transaction tx = graphDB.beginTx();
IndexManager indexMan = graphDB.index();
try{
indexMan.forNodes(lab.name(), config);
tx.success();
} finally {
tx.close();
}

因为这为您提供了 Cypher 入口点,但是索引和层之间是否存在质量差异?一个层是否比索引具有更好的性能,或者它们都由相同的 R 树支持。

这个问题的建议:Neo4J huge performance degradation after records added to spatial layer似乎我应该在启动空间层之前将所有节点放入数据库,因为它的索引比增量插入快得多。

我明天试试。

最佳答案

您使用哪个 Neo4j 版本?

是的,请分享您的疑问。

如果您使用 LOAD CSV,您将有更好的性能,首先使用 MERGE 单独创建节点,然后在第二遍中使用 MATCH 创建关系...匹配...创建...

另请参阅:http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

如果您不使用 LOAD CSV,您会进行单独的小额交易吗?如果是这样,将它们分批处理为例如每个事务 1000 个操作是有意义的。

您是否还可以通过浏览器中的“:schema”或 shell 中的“schema”验证您的约束是否到位?

并通过在 shell 中分析您的查询来检查索引/约束是否实际使用?只需在其前面加上 profile 即可。

关于neo4j - 空间层插入性能差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27441518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com