Удалить с помощью Periodic Iterate не работает

Я использую этот запрос для удаления большого количества узлов, и он отлично работает в 4.0.0, но с 4.1.1, похоже, не работает.

CALL apoc.periodic.iterate('
MATCH (s:Thing{id:$thingId})
  CALL apoc.path.subgraphNodes(s, {}) YIELD node
  RETURN node',
'DETACH DELETE node',
{batchSize:2000, iterateList:true, parallel:false, params: { thingId: $idOfThingToDelete}}) YIELD total, batches, errorMessages
RETURN total

Это ошибки со следующим

Не удалось вызвать процедуру apoc.periodic.iterate: причина: org.neo4j.graphdb.NotFoundException: узел 78063 не найден

И затем дальше в журнале мы получаем это

Не удалось вызвать процедуру apoc.periodic.iterate: Причина: java.lang.IllegalStateException: НЕ ЧАСТЬ ЦЕПИ! RelationshipTraversalCursor [id = 64250, открытое состояние с: плотный узел = ложь, следующий = 64250, режим = обычный, базовая запись = отношение [64250, используется = истина, источник = 86327, цель = 86330, тип = 7, sPrev = 64238, sNext =-1,tCount=1,tNext=-1,prop=478773,secondaryUnitId=-1,!sFirst, tFirst]]

Я вижу узел с идентификатором 78063, и он выглядит нормально, поэтому я не понимаю, почему он говорит, что не может его найти.

Любая помощь приветствуется, спасибо!

Обновить

Это второй запрос, который я пробовал, в котором используется различное, но он по-прежнему выдает ошибку Узел 12345 не найден.

CALL apoc.periodic.iterate(
    'MATCH (t:Thing{id:$thingId})
    CALL apoc.path.subgraphNodes(s, {}) YIELD node
    RETURN DISTINCT node',
    'DETACH DELETE n',
    {batchSize:2000, iterateList:true, parallel:false, params: { thingId: $idOfThingToDelete}}) YIELD total, batches, errorMessages
RETURN total

person Richard    schedule 20.10.2020    source источник
comment
После перехода с Neo4j 3.5 на 4.2.6 (оба Enterprise Edition) у нас также есть явление java.lang.IllegalStateException: NOT PART OF CHAIN! в неизменном коде. Также у нас это должно быть сужено до apoc.path.subgraphNodes во фрагменте apoc.periodic.iterate, расширение размера DISTINCT или кучи, к сожалению, не помогает.   -  person ThirstForKnowledge    schedule 23.05.2021


Ответы (1)


Процедура apoc.path.subgraphNodes может возвращать один и тот же узел несколько раз, поэтому следует использовать RETURN DISTINCT node, чтобы каждый узел возвращался только один раз.

Например:

CALL apoc.periodic.iterate(
  'MATCH (s:Thing{id:$thingId})
   CALL apoc.path.subgraphNodes(s, {}) YIELD node
   RETURN DISTINCT node',
  'DETACH DELETE node',
  {batchSize:2000, iterateList:true, parallel:false,
   params: {thingId: $idOfThingToDelete}}) YIELD total, batches, errorMessages
RETURN total
person cybersam    schedule 27.10.2020
comment
Эй, спасибо за этот ответ! Мы вносим это изменение, и кажется, что оно отлично работает для нас на 4.0.0, но, хотя оно, кажется, уменьшает использование памяти (возможно) на 4.1.1, оно все еще дает нам ошибку Node not found. Мы возвращаем уникальный идентификатор узла, а не сам узел (ВОЗВРАТИТЬ ОТЛИЧНЫЙ ИДЕНТИФИКАТОР (узел) КАК идентификатор узла). Может ли это быть частью проблемы? - person Richard; 11.11.2020
comment
Я сделаю, как только смогу (надеюсь, в ближайшие час или два), еще раз спасибо. - person Richard; 11.11.2020
comment
К сожалению, та же проблема, используя этот запрос (ниже) - person Richard; 11.11.2020
comment
На самом деле, опубликовал новый запрос как обновление моего исходного вопроса по причинам форматирования. - person Richard; 11.11.2020
comment
Увеличение размера пакета помогает, но с большими объемами данных нам просто нужно продолжать увеличивать значение, иначе я просто сталкиваюсь с той же проблемой. - person Richard; 11.11.2020