删除Neo4j节点的所有标签
以下示例摘自Neo4j文档 使用Cypher,可以使用Cypher语句删除单个已知标签,如下所示:删除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语句删除节点上的所有标签呢?目前还没有语法!标签通常是已知数量的东西,所以如果您愿意,可以将它们全部列出
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
——这很难看,但应该可以用。