Как обработать откат транзакции в 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(*);
Другие вопросы по тегам