apoc refactor rename дает Процедура не поддерживает неявную ошибку именования - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь написать запрос шифрования, который извлекает набор меток, которые разделяют одну конкретную метку.После выбора меток я пытаюсь переименовать их.Что означает добавление префикса к каждой из меток и переименование меток на графике с помощью apoc.refactor.rename.label.Поэтому я написал следующий запрос.

match (c:TheLabel) 
with collect(distinct filter( l in labels(c) where not l in ["UNIQUE IMPORT LABEL","TheLabel"])[0]) as curr_label 
unwind curr_label as cl 
with cl as cl, "AR_"+cl as nl
call apoc.refactor.rename.label(cl, nl) 
return null

Но этот запрос не выполняется со следующим сообщением об ошибке:

Neo.ClientError.Statement.SyntaxError: Procedure call inside a query does not support naming results implicitly (name explicitly using `YIELD` instead) (line 5, column 1 (offset: 214))
"call apoc.refactor.rename.label(cl, nl) return null"

Я не могу понять, где я мог использовать yield для выполнения этого запроса,Я пробовал первую часть отдельно, т.е. вернуть nl & cl после с.Это отлично работает.Я также попытался использовать функцию переименования с одним конкретным cl и cl, который я получил при попытке выполнить первую часть запроса.Это тоже работает нормально.Кажется, что только комбинация не работает.

Редактировать:

Я понял, что каждый разматывание, похоже, нарушает запрос, если я использую переменную, определенную как размотка или нет.Минимальный пример, который выдает такую ​​же ошибку:

unwind [1,2,3,4] as cl 
call apoc.refactor.rename.label("Test", "Test") 
return cl

Заранее благодарен за любую помощь или решения.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Если определена процедура для возврата каких-либо результатов, то язык Cypher требует, чтобы предложение CALL было сопряжено с предложением YIELD - даже если вас не волнует ни одно изРезультаты.Единственное исключение - когда весь оператор Cypher состоит только из предложения CALL (в документах это называется "автономным вызовом процедуры").

Цитировать из документов :

Если вызываемая процедура объявляет хотя бы одно поле результата, YIELD обычно не может быть опущено.Однако YIELD всегда может быть опущен в вызове отдельной процедуры.В этом случае все поля результата выдаются как новые связанные переменные из вызова процедуры для пользователя.

0 голосов
/ 20 февраля 2019

Хорошо, попробовав, я понял это.Вам нужно указать хотя бы одно поле возврата вызова, например:

unwind [1,2,3,4] as cl 
call apoc.refactor.rename.label("Test", "Test") 
yield total
return null // everything is possible for return.

Я не знаю, почему это работает, но работает.Может быть, это связано с потоком, который создает процедура, но я действительно не уверен.Если кто-то знает, почему это решает мою проблему, пожалуйста, прокомментируйте.

...