需求

希望通过批量操作,提升 neo4j 的性能。

虚假的批量

OGM session.save 入参可以是 list,开始以为这里可以直接批量保存。

实际测试发现逐条保存和单个保存耗时差不多,看了下源码,应该是一个循环。

基于 UNWIND,待验证

在Neo4j中,实现批量插入数据可以通过使用Cypher查询语言的UNWINDCREATE语句来实现。

UNWIND用于展开列表,并且可以将其与CREATE一起使用,以一次性创建多个节点或关系。这样可以最小化与数据库的交互次数,从而提高性能。

以下是一个简单的示例,演示如何使用UNWINDCREATE进行批量插入节点:

UNWIND $dataList AS data
CREATE (:Node {property1: data.property1, property2: data.property2})

在上述查询中,$dataList是一个参数,它是一个包含要插入的数据的列表。

通过UNWIND,我们将列表展开,然后使用CREATE一次性创建多个节点。

在使用Neo4j OGM的情况下,你可以通过将数据转换为对应的实体对象,并使用OGM的Session来执行Cypher查询。

以下是一个Java示例:

List<MyNodeEntity> dataList = // 要插入的数据列表
Session session = sessionFactory.openSession();

Map<String, Object> parameters = new HashMap<>();
parameters.put("dataList", dataList);

session.query("UNWIND $dataList AS data CREATE (:MyNodeEntity {property1: data.property1, property2: data.property2})", parameters);
session.clear(); // 清理缓存

try(Transaction transaction = session.beginTransaction()) {
    transaction.commit();
}

这里假设MyNodeEntity是你的实体类,包含要插入的节点的属性。

在这个例子中,dataList是要插入的数据列表,通过参数传递给Cypher查询。

请注意,在实际应用中,要根据你的数据模型和需求进行调整。确保你的数据模型和Cypher查询符合你的应用程序的需求。

异步

可以在这里使用异步入库。

不过批量就会带来一些问题,比如如果一些数据存在

小结

参考资料

chat