Neo4J APOC Периодическая Итерация – ПримечаниеИзСлота(2) в виде карты, но это было: NO_VALUE: 4

Вопрос или проблема

Neo4J APOC Периодическая Итерация – ПримечаниеИзСлота(2) в виде карты, но это было: NO_VALUE: 4

У меня есть узлы с меткой TypeA, у которых есть строковое свойство propA. propA — это строка в формате JSON и может быть преобразована в карту с помощью apoc.convert.fromJsonMap().

Я хочу создать новые узлы TypeB, свойства которых — это propA, и установить отношение между обоими узлами. Я успешно выполнил следующий запрос:

MATCH (n:TypeA) WITH apoc.convert.fromJsonMap(n.propA) AS values,n limit 1 MERGE (v:TypeB) SET v=values WITH n,v MERGE (v)-[:RELATION_TYPE]->(n) RETURN v,n;

Однако, когда я использую следующее с apoc.periodic.iterate, чтобы преобразовать всю мою базу данных, возникает ошибка. Запрос, который я выполняю:

CALL apoc.periodic.iterate("MATCH (n:TypeA) RETURN n;", "WITH apoc.convert.fromJsonMap(n.propA) AS values,n MERGE (v:TypeB) SET v=values WITH n,v MERGE (v)-[:RELATION_TYPE]->(n) RETURN v,n;", {batchSize:10000, parallel: false});

Ошибка:

{
  "Expected ReferenceFromSlot(2) to be a map, but it was :`NO_VALUE`": 4382
}

Любая помощь будет очень признательна.

Ответ или решение

Ваша проблема связана с тем, что при использовании apoc.periodic.iterate Neo4j возвращает ошибку Expected ReferenceFromSlot(2) to be a map, but it was : NO_VALUE. Это происходит из-за того, что не для всех узлов TypeA свойство propA является корректным JSON и может быть преобразовано в карту с помощью apoc.convert.fromJsonMap.

Вот как вы можете исправить свою проблему и убедиться, что только узлы с корректными JSON будут обрабатываться:

  1. Добавьте фильтрацию: Прежде всего, убедитесь, что вы обрабатываете только те узлы, у которых propA содержит корректный JSON. Вы можете использовать функцию apoc.util.validateJson для проверки корректности JSON.

  2. Используйте apoc.periodic.iterate с фильтрацией: Обновите ваш вызов apoc.periodic.iterate, чтобы добавить проверку на корректный JSON. Я предлагаю использовать следующий код:
CALL apoc.periodic.iterate(
  "MATCH (n:TypeA) WHERE n.propA IS NOT NULL AND apoc.util.validateJson(n.propA) RETURN n;",
  "WITH apoc.convert.fromJsonMap(n.propA) AS values, n 
   MERGE (v:TypeB) 
   SET v = values 
   WITH n, v 
   MERGE (v)-[:RELATION_TYPE]->(n) 
   RETURN v, n;",
  {batchSize: 10000, parallel: false}
);

В этом коде:

  • Я добавил условие WHERE n.propA IS NOT NULL AND apoc.util.validateJson(n.propA) для того, чтобы отфильтровать узлы TypeA, у которых propA не является NULL и является корректным JSON.
  • Это гарантирует, что функция apoc.convert.fromJsonMap не столкнется с ошибкой NO_VALUE, так как она будет применяться только к допустимым значениям.
  1. Отладка и тестирование: Если вы все еще сталкиваетесь с ошибками, я рекомендую выполнять запросы по частям. Например, сначала выполните только часть, которая извлекает узлы TypeA, чтобы убедиться в корректности данных.

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

Оцените материал
Добавить комментарий

Капча загружается...