Neo4j 2.1.2: невозможно удалить узлы с помощью Cypher query, который работал с Neo4j 2.0.1

#neo4j #cypher

#neo4j #cypher

Вопрос:

Недавно я обновился до Neo4j 2.1.2 с Neo4j 2.0.1 и начал получать новую ошибку при попытке удалить узлы.

Этот код работает в 2.0.1 для удаления узла, который соединяет два других узла, и заменяет его двунаправленной связью.

 MATCH (a:node {id: 1})
WITH a

MATCH (b1:node)-[:rel]->(a)<-[:rel]-(b2:node)
CREATE UNIQUE (b1)-[:rel]->(b2), (b2)-[:rel]->(b1)
WITH a

OPTIONAL MATCH (a)-[r]-()
DELETE a, r
 

Но выдает следующую ошибку в 2.1.2:

 {Code:"Neo.DatabaseError.Statement.ExecutionFailure", Message:"Node 4746 has been deleted"}
 

Я попытался изменить его на это:

 MATCH (b1:node)-[r1:rel]->(a)<-[r2:rel]-(b2:node)
CREATE UNIQUE (b1)-[:rel]->(b2), (b2)-[:rel]->(b1)
DELETE r1, r2, a
 

Но я все еще получаю то же сообщение об ошибке. Я также попытался поместить DELETE в другой оператор в той же транзакции, и это также не удалось. Я проверил шифр для всех операторов в транзакции, и после удаления к a, r1 и r2 больше никогда не обращаются. Удаление DELETE в этом операторе приводит к успешному завершению транзакции.

Как правильно удалять узлы как часть транзакции?

Обновить

Я не могу получить точную копию этой ошибки, но определенно что-то не так. Все будет работать нормально, а затем внезапно я начну получать сообщения об ошибках об удалении узлов или о том, что связи не найдены.

Я сузил его до следующего запроса:

   MATCH (a:activity {id: { param0 } }), (i:file {id: { param1 } })
  CREATE (i)-[:HISTORY {id: i.id}]->(a)
  WITH a, i

  MATCH (i)-[r:HISTORY {id: i.id}]->(ph:activity)
  WHERE ph.id <> a.id
  CREATE (a)-[:HISTORY {id: i.id}]->(ph)
  DELETE r
 

Я выдаю это как часть более крупной транзакции, но удаляю DELETE r результаты в сообщениях об ошибках, которые никогда не создаются. В противном случае я случайно получаю:

Код ошибки: «», Raw: amp;errors.errorString{s:»Neo4j не удалось загрузить СВЯЗЬ с идентификатором 2397. ( Neo.Ошибка ClientError.Инструкция.EntityNotFound) «},

Странная часть заключается в том, что транзакция завершается успешно и не откатывается, даже если она выдает ошибку. На данный момент я считаю, что это проблема с синхронизацией, и именно поэтому я не могу получить для нее достоверное представление. Есть ли дополнительная отладка, которую я могу включить, чтобы помочь отследить проблему, когда она возникает?

Комментарии:

1. Вы запускаете это в более крупной транзакции? Или просто как один оператор? Для встроенных или серверных? И вы могли бы поделиться этой базой данных с нами?

2. Это часть более крупной транзакции против транзакционной конечной точки сервера Neo4j. Я не тестировал его как отдельную инструкцию, поскольку в 2.0.1 это работало нормально. Я могу поделиться с вами полным кодом транзакции, которая выдает ошибку в частном порядке (при выполнении этого теста база данных пуста). Куда я должен отправить его по почте?

3. Неважно, я больше не могу воспроизвести проблему (после того, как ударил ее в течение 2 часов сегодня днем …). Я удалил базу данных после тестирования, и с новой базой данных она не сталкивается с той же проблемой. Предполагаю, что был неверный индекс или что-то в этом роде? Я отвечу, если смогу заставить это повториться.

4. Хорошо, спасибо. В противном случае отправьте его Майклу по адресу neo4j.org

5. Это определенно проблема времени. Я все еще вижу это время от времени во время моих тестов, и как только это начинает происходить, мне обычно приходится удалять базу данных, чтобы остановить ее. Я обновил вопрос: есть ли дополнительная отладка, которую я могу включить, которая помогла бы отследить эту проблему?