2016-03-31 7 views
2

Я пытаюсь импортировать большой объем данных из csv в neo4j с помощью neo4j-rest java api. Для того, чтобы избежать из исключений памяти, я использую периодический коммит, поэтому код Java образца будет:Как обрабатывать откат транзакций в Neo4j во время загрузки больших данных из csv с помощью периодического фиксации

// 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(); 

Теперь мой вопрос, как я должен обрабатывать транзакции откатов в периодических фиксациях? Я знаю, что периодические операции фиксации не могут выполняться в открытой транзакции, и они должны быть совершены сразу после отправки запроса. Это означает, что нельзя откатываться, если что-то пойдет не так. Я предполагаю, что это обычная проблема в пакетных вставках, так как я должен обрабатывать такие откаты? Должен ли я сбросить свой db в neo4j и попытаться начать весь процесс с самого начала? Есть предположения?

+0

использовать параметр для URL –

+0

да я использую его в моем реальном коде :-) Я просто изменил его, чтобы положить его здесь в коде. Спасибо, Майкл. – Lina

ответ

1

Правильный, ПЕРИОДИЧЕСКИЙ КОМИТЕТ фиксирует все x-строки по умолчанию.

Единственное, что вы можете сделать, это отметить ваши «в полете» узлы определенной меткой, например :Importing, и удалить эту метку, если ваш импорт был успешным, или удалить все узлы и их отношения, если что-то не удалось. Вы должны выполнить его, хотя.

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

Спасибо, Майкл, мне нужно все бросить! В этом случае, я думаю, мне действительно не нужно отмечать их каким-либо ярлыком. Я все еще использую neo 2.2.5, поэтому DETACH пока не работает. Будешь использовать: MATCH п н LIMIT 10000 ДОПОЛНИТЕЛЬНОГО MATCH n- [г] -() УДАЛИТЬ п, г еще один вопрос. {WITH n LIMIT 10000} -> Будет ли это работать как партии? Я имею в виду, если у меня есть 1000000 узлов, то это будет выполняться 100 раз? – Lina