删除Neo4j节点的所有标签

删除Neo4j节点的所有标签,neo4j,cypher,Neo4j,Cypher,以下示例摘自Neo4j文档 使用Cypher,可以使用Cypher语句删除单个已知标签,如下所示: MATCH (n { name: 'Peter' }) REMOVE n:German RETURN n 也可以删除多个标签,如下所示: MATCH (n { name: 'Peter' }) REMOVE n:German:Swedish RETURN n 那么,如何使用简单的Cypher语句删除节点上的所有标签呢?目前还没有语法!标签通常是已知数量的东西,所以如果您愿意,可以将它们全部列出

以下示例摘自Neo4j文档

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

MATCH (n { name: 'Peter' })
REMOVE n:German
RETURN n
也可以删除多个标签,如下所示:

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

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

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

那么,两步加密方法如何?使用cypher生成一些cypher语句,然后在shell中执行cypher语句

您可以尝试这样的方法来生成批处理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;
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
您可能希望删除任何重复项,根据您的数据,可能会有很多重复项

不完全是你想要的,但我认为它会让你使用cypher和neo4j外壳达到相同的最终状态


下面是经过改进的全新密码……

我把它编辑成可以在浏览器中单独使用的东西。它认为这是一个更好的解决方案。这仍然是两个步骤,但它会生成一条可以剪切并粘贴到浏览器中的语句

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 (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;
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浏览器中。

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

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

可以在cyher中添加一个
distinct
,这样您就不需要在:)之后对复制品进行排序。我想OP是在询问如何仅使用Cypher本身来完成这一操作。一旦你不得不使用Neo4j外壳,你可以手动做任何事情;尽管如此,它仍然是塞弗。我想你的意思是只可以在浏览器中运行的东西?不管是哪种方式,它都让我想到了一个只有浏览器的解决方案,它仍然需要两个步骤,但可以在浏览器中运行。所以我制作了上面的加法。这是一个大问题。无法删除所有标签,也无法更新节点,使其仅包含所需的特定标签。换句话说,如果一个节点有标签l1和l2,并且我想更新它有标签l1和l3,那么似乎没有办法在不明确删除l2的情况下将标签设置为l1和l3。我们使用标签来表示类型。如果应用程序中的节点类型发生更改,我们希望能够更新节点上的标签以反映这一点。如果我错了,请纠正我。如果你知道图表中的所有标签,你应该知道,你可以做一些类似于
match(n)删除n:label1:label2:label3:labelN
——这很难看,但应该可以用。