首页 文章

如何使用定期提交从csv加载大数据时处理Neo4j中的事务回滚

提问于
浏览
2

我试图使用neo4j-rest java api将大量数据从csv导入neo4j . 为了避免内存不足异常,我使用的是定期提交,因此示例java代码将为:

// just to let you know what classes I am using
    import org.neo4j.rest.graphdb.query.CypherTransaction;
    import org.neo4j.rest.graphdb.query.CypherTransaction.Statement;
    import org.neo4j.rest.graphdb.query.CypherTransaction.Result;
    import org.neo4j.rest.graphdb.query.CypherTransaction.ResultType;

private static final String CREATE_USER = 
    " USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM " +
                "\"URL\"   AS line  WITH line\n" +
                " CREATE (u:USER{id:toInt(line.customer_key)})";

//create USER Node
Statement userStatement = new Statement(CREATE_USER, null, ResultType.rest, false);

CypherTransaction periodicCommitTransaction = new CypherTransaction(dbPath, CypherTransaction.ResultType.rest);
            periodicCommitTransaction.addAll(userStatement);
            periodicCommitTransaction.commit();

现在我的问题是如何在定期提交中处理事务回滚?我知道定期提交语句不能在打开的事务中运行,它们应该在发送请求后立即提交 . 这意味着如果出现问题,就无法回滚 . 我想这是批量插入中的常见问题,那么我该如何处理这种回滚呢?我应该将我的数据库放入neo4j并尝试从头开始整个过程吗?有什么想法吗?

1 回答

  • 1

    正确,PERIODIC COMMIT默认提交每个x行 .

    您唯一能做的就是使用某个标签(如 :Importing )标记"in-flight"节点,如果导入成功则删除该标签,或者如果出现故障则删除所有节点及其关系 . 你必须批量处理它 .

    MATCH  (n:Importing) 
    WITH n LIMIT 10000 
    DETACH DELETE n 
    RETURN count(*);
    

相关问题