Как обработать откат транзакции в Neo4j при загрузке больших данных из csv с использованием периодической фиксации
Я пытаюсь импортировать большой объем данных из CSV в neo4j с помощью Java-API neo4j-rest. Чтобы избежать нехватки памяти, я использую периодическую фиксацию, поэтому пример кода 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 ответ
Правильно, PERIODIC COMMIT фиксирует каждые x-строки по умолчанию.
Единственное, что вы можете сделать, это пометить ваши "в полете" узлы с определенной меткой, как :Importing
и удалите эту метку, если ваш импорт был успешным, или удалите все узлы и их связи, если что-то не удалось. Вы должны пакетировать это все же.
MATCH (n:Importing)
WITH n LIMIT 10000
DETACH DELETE n
RETURN count(*);