删除所有标签并动态设置新标签列表

时间:2016-09-08 06:43:01

标签: neo4j cypher

我尝试动态更新节点的标签,但没有成功。我想删除节点的所有标签,然后我想为同一节点设置新的标签列表。

我的方法(失败,尝试仅删除标签):

WITH ['a','b','c'] as newlabels
MATCH (n:people{name:'mam'}) 
WITH n,newlabels,labels(n) as oldlabels 
FOREACH (l in oldlabels | REMOVE n:l)
SET n:newlabels
RETURN labels(n)

我怀疑,标签不能使用引用动态更改。我的理解是否正确?我们怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

否,因为您说使用原始密码无法进行动态标签修改。主要是因为标签,属性键,关系类型是查询计划的一部分并用于缓存。

可以使用APOC程序动态添加标签,如下所述:

https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_using_cypher_and_apoc_to_move_a_property_value_to_a_label

MATCH (n:Movie)
CALL apoc.create.addLabels( id(n), [ n.genre ] ) YIELD node
REMOVE node.studio
RETURN node

可能替换/删除现有标签的功能可能是APOC的一个很好的补充。

<强>更新

在检查APOC的来源之后,有一个setLabels程序将删除不匹配的传递标签,例如:

WITH ["A","B"] as labels
MATCH (m:Movie)
WITH collect(id(m))[0..20] as movies, labels
CALL apoc.create.setLabels(movies, labels) YIELD node RETURN node, labels(node)


│node                          │labels(node)│
╞══════════════════════════════╪════════════╡
│{tagline: Prepare to enter a s│[B, A]      │
│ecret world of assassins, titl│            │
│e: Ninja Assassin, released: 2│            │
│009}                          │            │
├──────────────────────────────┼────────────┤
│{tagline: Walk a mile you'll n│[B, A]      │
│ever forget., title: The Green│            │
│ Mile, released: 1999}        │            │
├──────────────────────────────┼────────────┤
│{tagline: 400 million people w│[B, A]      │
│ere waiting for the truth., ti│            │
│tle: Frost/Nixon, released: 20│            │
│08}                           │            │
├──────────────────────────────┼────────────┤
│{tagline: He didn't want law. │[B, A]      │
│He wanted justice., title: Hof│            │
│fa, released: 1992}           │            │
├──────────────────────────────┼────────────┤

问题解决了:))