Вопрос или проблема
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 будут обрабатываться:
-
Добавьте фильтрацию: Прежде всего, убедитесь, что вы обрабатываете только те узлы, у которых
propA
содержит корректный JSON. Вы можете использовать функциюapoc.util.validateJson
для проверки корректности JSON. - Используйте
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
, так как она будет применяться только к допустимым значениям.
- Отладка и тестирование: Если вы все еще сталкиваетесь с ошибками, я рекомендую выполнять запросы по частям. Например, сначала выполните только часть, которая извлекает узлы
TypeA
, чтобы убедиться в корректности данных.
Следуя этим шагам и используя данный код, ваш запрос должен работать корректно, и вы сможете создать новые узлы типа TypeB
и установить с ними отношения, избегая ошибок, связанных с некорректными значениями.