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 中并尝试从头开始整个过程​​吗?有什么想法吗?

4

1 回答 1

1

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

您唯一能做的就是用某个标签标记您的“运行中”节点,:Importing如果您的导入成功,则删除该标签,或者如果某些事情失败,则删除所有节点及其关系。不过,您必须对其进行批处理。

MATCH  (n:Importing) 
WITH n LIMIT 10000 
DETACH DELETE n 
RETURN count(*);
于 2016-04-01T01:39:03.763 回答