Neo4j顺序数据库事务问题

时间:2017-06-22 06:06:25

标签: neo4j spring-data-neo4j

我有一个Spring Data Neo4j应用程序需要对Neo4j Community Edition(3.2)进行批量数据写入/读取。

我的系统配置(Macbook pro) 16GB RAM,2.5 GHz Intel Core i7。

总节点数: 120,000 。 (每个节点中的 5 属性。)

每个节点都有 500 关系。

上面的节点/关系是我需要的其他应用程序部分工作所需的初始数据的一部分。

我使用Spring Data Neo4j进行读/写事务。每个节点按顺序构建其对应的500个关系。显然,构建所有上述节点和关系需要花费大量时间。

示例代码:

实体:

//Neo4j entity class
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;

@NodeEntity
public class SamplePojo {

@GraphId
    public Long id;
    private String property1;
    private String property2;
    private Integer property3;
    private Double property4;
    private Integer property5;

@Relationship(type="has_sample_relationship",direction="OUTGOING")
    List<SamplePojo> sampleList = new ArrayList<>();

//Getters and setters...

}

存储库:

import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.GraphRepository;

@Repository
public interface SamplePojoRepository extends GraphRepository<SamplePojo> {

//save

}

服务类:

  @Service
    public class DataInsertion{

    @Autowired
    SamplePojoRepository repository;


    public writeToNeo4j(List<SamplePojo> pojoList){

    for(SamplePojo p : pojoList){

    // Loop through more than 100,000 objects that have properties set and relationships as well

    repository.save();    // save to neo4j db

    }  
}
     }

我的观察:

最初, 前几分钟, 1200次写入操作/分钟

几分钟后,写入操作从 1200 显着降低到 100次写入操作/分钟 。< / p>

之后,它归结为 10次写入操作/分钟

有没有人知道为什么Neo4j写入操作会随着时间的推移而减慢的根本原因?

如果需要其他信息,请告知我们,我们会更新问题。提前谢谢!

1 个答案:

答案 0 :(得分:5)

这是一个非常广泛的问题,您至少应该对您的应用程序进行分析,以确定哪个部分减速 - 这是Neo4j本身吗?具体查询? Spring Data Neo4j?你的申请?然后它会更容易帮助你。

通常的嫌疑人是:

  • 您的事务太大 - 将负载拆分为1k到50k元素(节点+关系+属性)的较小事务 - 这是必需的,因为Neo4j在内存中保存事务状态并且可能在GC中花费了很长时间(当你有大笔交易时,甚至会耗尽内存。

  • 不断增长的OGM会话 - 再次导致花费大量时间在GC上 - 不时清除会话(这应该在@Transactional方法完成时自动使用SDN完成)

  • 有一些操作没有索引随着数据量的增加而变慢(例如,执行完整节点标签扫描而不是使用索引)

  • Neo4j或您的应用程序的内存不足 - 主要用于GC的时间

  • SDN / OGM可能存在性能问题 - 可重现的测试用例对此非常有用。