2016-10-24 3 views
0

Я пытаюсь исправить неправильные данные в моей базе данных 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, я вижу, что добавление чтения узлов с использованием динамических клавиш было добавлено чуть больше года назад, но похоже, что они сделали его специально нацеленным только на чтение. Я начал рыть через источник Нео, но это бегемот. Любая помощь будет оценена по достоинству.

+0

AFAIK, вы правы, запись в свойства с динамическим ключом не поддерживается изначально в Cypher. Однако в 'apoc' есть много вариантов. –

+0

Apoc выглядит потрясающе, спасибо! Здесь есть множество функций, любые указатели на то, где вы думаете, я должен начать искать в документации то, что я хочу сделать? –

+0

Я не работал с ним через некоторое время, но я считаю, что вы можете создать карту с помощью 'apoc.map.fromPairs()', передать динамически сгенерированный ключ, пару значений, затем 'SET m + = result', где результат - это то, что вы называете результатом процедуры. Если ваш проект не мешает вам использовать бета-версии, я бы предложил переключиться на 3.1 и получить новейший APOC, он позволяет вам вместо '' apom.map' как функции. –

ответ

1

Для тех, кто придет после этого, библиотека Tore предложила - APOC - только что выпустила версию 3.0.4.2, в которой была введена «apoc.create.setProperty», и делает именно то, что мне нужно. Кроме того, я обнаружил, что регулярные выражения намного быстрее в Neo4j, чем прямые текстовые поиски (на порядок быстрее), поэтому я тоже пошел с этим.

Мой последний высчитывать вышел быть:

MATCH (n:xLabelNamex) 
WITH 
    n, 
    [x IN keys(n) 
     WHERE n[x] =~ '".*"' 
    ] AS doesMatch 
WHERE size(doesMatch) > 0 
UNWIND doesMatch AS label 
    MATCH (m:xLabelNamex) 
    WHERE id(n)=id(m) 
    CALL apoc.create.setProperty(m, label, SUBSTRING(m[label], 1, SIZE(m[label]) - 2)) 
    YIELD node 
RETURN node 

работает как шарм.

Реквизиты для тора, еще раз спасибо!