Neo4j 顺序数据库事务问题

Neo4j sequential db transactions issue

我有一个 Spring Data Neo4j 应用程序,它需要向 Neo4j Community Edition (3.2) 执行批量数据 write/read。

我的系统配置(Macbook pro) 16GB 内存,2.5 GHz 英特尔酷睿 i7。

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

我每个节点有 500 个关系。

以上 nodes/relationships 是应用程序其他部分工作所需的初始数据的一部分。

我使用 Spring Data Neo4j 进行 read/write 交易。每个节点依次建立其对应的 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

}

服务class:

  @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 次写入 operations/minute.

几分钟后,写入操作从 1200 显着下降到 100 写入 operations/minute .

后来归结为10写operations/minute.

有谁知道 Neo4j 写操作随时间变慢的根本原因吗?

如果需要更多信息,请告诉我,我们会更新问题。提前致谢!

这是一个非常宽泛的问题,您至少应该分析您的应用程序以确定哪个部分变慢了 - 是 Neo4j 本身吗?具体查询? Spring 数据 Neo4j?你的申请?以后帮到你会更容易。

通常的嫌疑人是:

  • 您的事务太大 - 将负载拆分为 1k 到 50k 元素(节点 + 关系 + 属性)的较小事务 - 这是必需的,因为 Neo4j 在内存中保存事务状态并且它可能花费很多当您有大量事务时,GC 时间(甚至 运行 内存不足)。

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

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

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

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