apoc重构重命名给出过程不支持隐式命名错误

时间:2019-02-20 14:38:18

标签: neo4j cypher neo4j-apoc

我尝试编写一个密码查询,以提取一组共享一个特定标签的标签。选择标签后,我尝试重命名它们。这意味着在每个标签上添加前缀,并借助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

在此先感谢您的帮助或解决方案。

2 个答案:

答案 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.

我不知道为什么它起作用,但是它起作用。也许它必须对过程产生的流进行某些处理,但我不确定。如果有人知道为什么它可以解决我的问题,请发表评论。