如何在使用定期提交从 csv 加载大数据时处理 Neo4j 中的事务回滚
How to handle transaction rollback in Neo4j while Loading large data from csv using periodic commit
我正在尝试使用 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 中并尝试从头开始整个过程吗?有什么想法吗?
正确,PERIODIC COMMIT 默认提交每 x 行。
您唯一可以做的就是用 :Importing
之类的特定标签标记您的 "in-flight" 节点,如果导入成功则删除该标签,或者删除所有节点及其关系失败的。
不过你必须批处理它。
MATCH (n:Importing)
WITH n LIMIT 10000
DETACH DELETE n
RETURN count(*);
我正在尝试使用 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 中并尝试从头开始整个过程吗?有什么想法吗?
正确,PERIODIC COMMIT 默认提交每 x 行。
您唯一可以做的就是用 :Importing
之类的特定标签标记您的 "in-flight" 节点,如果导入成功则删除该标签,或者删除所有节点及其关系失败的。
不过你必须批处理它。
MATCH (n:Importing)
WITH n LIMIT 10000
DETACH DELETE n
RETURN count(*);