Я пытаюсь исправить неправильные данные в моей базе данных Neo4j, и я хотел бы иметь только кеппер для обновления, а не для переноса миллионов строк в пользовательское приложение и обратно.CQL - Как установить свойство узла Neo4j с помощью динамического ключа в cypher?
Я создал запрос на чтение, в котором используются динамические ключи для поиска по каждому свойству на всех узлах ярлыков, которые я указывал для различных типов проблем - в данном случае, некорректно сериализованной строки. Проблема я бегу в том, что в то время как запрос чтения с использованием динамических ключей отлично работает:
MATCH (n:xLabelNamex)
WITH
n,
[x IN keys(n)
WHERE n[x] STARTS WITH "\""
AND n[x] ENDS WITH "\""
] AS doesMatch
WHERE size(doesMatch) > 0
UNWIND doesMatch AS label
MATCH (m:xLabelNamex)
WHERE id(n)=id(m)
RETURN SUBSTRING(m[label], 1, SIZE(m[label]) - 2)
Но если оставить все то же самое, и изменить последнюю строку
RETURN SUBSTRING(m[label], 1, SIZE(m[label]) - 2)
к:
SET m[label] = SUBSTRING(m[label], 1, length(m[label]) - 2)
Результаты в погрешности:
Invalid input '[': expected an identifier character, node labels, a property map, whitespace, a relationship pattern, '(', '.', '=' or "+=" (line 12, column 10 (offset: 255))
" SET m[label] = SUBSTRING(m[label], 1, SIZE(m[label]) - 2)"
^
Есть ли способ сделать это, или я иду по неверной дороге здесь?
Глядя на обсуждения в Github, я вижу, что добавление чтения узлов с использованием динамических клавиш было добавлено чуть больше года назад, но похоже, что они сделали его специально нацеленным только на чтение. Я начал рыть через источник Нео, но это бегемот. Любая помощь будет оценена по достоинству.
AFAIK, вы правы, запись в свойства с динамическим ключом не поддерживается изначально в Cypher. Однако в 'apoc' есть много вариантов. –
Apoc выглядит потрясающе, спасибо! Здесь есть множество функций, любые указатели на то, где вы думаете, я должен начать искать в документации то, что я хочу сделать? –
Я не работал с ним через некоторое время, но я считаю, что вы можете создать карту с помощью 'apoc.map.fromPairs()', передать динамически сгенерированный ключ, пару значений, затем 'SET m + = result', где результат - это то, что вы называете результатом процедуры. Если ваш проект не мешает вам использовать бета-версии, я бы предложил переключиться на 3.1 и получить новейший APOC, он позволяет вам вместо '' apom.map' как функции. –