Neo4j顺序数据库事务问题

Tan*_*kar 1 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...

}
Run Code Online (Sandbox Code Playgroud)

库:

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

@Repository
public interface SamplePojoRepository extends GraphRepository<SamplePojo> {

//save

}
Run Code Online (Sandbox Code Playgroud)

服务类:

  @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

    }  
}
     }
Run Code Online (Sandbox Code Playgroud)

我的观察:

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

几分钟后,写入操作显着下降,从1200100次写入操作/分钟.

后来,它降至10次​​写入操作/分钟.

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

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

Fra*_*man 5

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

通常的嫌疑人是:

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

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

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

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

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