我尝试编写一个密码查询,以提取一组共享一个特定标签的标签。选择标签后,我尝试重命名它们。这意味着在每个标签上添加前缀,并借助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来运行此查询。 我分别尝试了第一部分,即在with之后返回nl&cl。这很好。我还尝试对一个特定的cl和cl使用重命名功能,而在尝试查询的第一部分时得到了cl和cl。那也很好。只有这种组合似乎无效。
编辑:
我发现,如果我使用是否由unwind定义的变量,则每个unwind似乎都会中断查询。 产生相同错误的最小示例:
unwind [1,2,3,4] as cl
call apoc.refactor.rename.label("Test", "Test")
return cl
在此先感谢您的帮助或解决方案。
答案 0 :(得分:3)
如果定义了一个过程以返回任何结果,则Cypher语言要求CALL子句必须与YIELD
子句配对-即使您不关心任何结果。唯一的例外是,当整个Cypher语句仅由CALL
子句组成时(在文档中这称为“独立过程调用”)。
引用the docs:
如果被调用过程声明了至少一个结果字段,则YIELD可以 通常不会省略。但是,在 独立过程调用。在这种情况下,将产生所有结果字段 作为从过程调用到用户的新绑定变量。
答案 1 :(得分:1)
确定后,我确定了。您需要产生至少一个返回呼叫的字段,例如:
unwind [1,2,3,4] as cl
call apoc.refactor.rename.label("Test", "Test")
yield total
return null // everything is possible for return.
我不知道为什么它起作用,但是它起作用。也许它必须对过程产生的流进行某些处理,但我不确定。如果有人知道为什么它可以解决我的问题,请发表评论。