删除Neo4j Node的所有标签

时间:2014-11-18 02:33:26

标签: neo4j cypher

以下示例来自找到here的Neo4j文档。

使用Cypher,可以使用Cypher语句删除单个已知标签,如下所示:

MATCH (n { name: 'Peter' })
REMOVE n:German
RETURN n

您还可以删除多个标签,如下所示:

MATCH (n { name: 'Peter' })
REMOVE n:German:Swedish
RETURN n

那么如何使用简单的Cypher语句从节点中删除所有标签?

3 个答案:

答案 0 :(得分:1)

目前还没有语法!标签通常是已知数量的东西,因此如果需要,您可以将它们全部列出。但是,没有动态的方法将它们全部删除。

答案 1 :(得分:1)

那么,两步密码方法怎么样?使用cypher生成一些cypher语句,然后在shell中执行cypher语句。

您可以尝试这样的方法来生成批处理密码语句

match (n) 
return distinct "match (n" 
+ reduce( lbl_str= "", l in labels(n) | lbl_str + ":" + l) 
+ ") remove n" 
+ reduce( lbl_str= "", l in labels(n) | lbl_str + ":" + l) 
+ ";"

输出应该看起来像这样......

match (n:Label_1:Label_2) remove n:Label_1:Label_2;
match (n:Label_1:Label_3) remove n:Label_1:Label_3;
match (n:Label_2:Label_4) remove n:Label_2:Label_4;

您可能希望删除任何重复项,并且根据您的数据,可能会有相当多的重复项。

不完全是你正在寻找的东西,但我认为它只会使用cypher和neo4j shell来达到同样的最终状态。


闪亮的新的和改进的密码......

我将其编辑为仅在浏览器中可用的内容。它暗示这是一个更好的解决方案。它仍然是两个步骤,但它产生一个可以剪切并粘贴到浏览器中的语句。

match (n) 
with distinct labels(n) as Labels
with reduce(lbl_str="", l in Labels | lbl_str + ":" + l) as Labels
order by Labels
with collect(Labels) as Labels
with Labels, range(0,length(Labels) - 1) as idx
unwind idx as i
return "match (n" + toString(i) + Labels[i] + ")" as Statement
union
match (n) 
with distinct labels(n) as Labels
with reduce(lbl_str="", l in Labels | lbl_str + ":" + l) as Labels
order by Labels
with collect(Labels) as Labels
with Labels, range(0,length(Labels) - 1) as idx
unwind idx as i
return "remove n" + toString(i) + Labels[i] as Statement

产生这样的输出......

match (n0:Label_A)
match (n1:Label_B)
match (n2:Label_C:Label_D)
match (n3:Label_E)
remove n0:Label_A
remove n1:Label_B
remove n2:Label_C:Label_D
remove n3:Label_E

然后可以剪切并粘贴到Neo4j浏览器中。

答案 2 :(得分:1)

您还可以使用doIt库中的apoc方法尝试这种方式:

match (n {name: 'Peter'})
call apoc.cypher.doIt(
  "match (o)" +
  " where ID(o) = " + ID(n) +
  " remove "+reduce(a="o",b in labels(n) | a+":"+b) + 
  " return (o);",
null)
yield value
return value