Neo4j:Cypher:如何按模式删除标签?
Neo4j: Cypher: How to remove labels by pattern?
我有一个 Neo4j 数据库,其中每个节点都有以下划线开头的标签。
例如(:User,_User), (:Store,:_Store)
等
这些下划线标签是由 Spring Data Neo4j 生成的,现在我想去掉它们(call db.schema()
returns 它们作为模式中的一个单独节点)。
目标只得到(:User), (:Store)
.
有什么方法可以通过某些查询做到这一点吗?
如果您从这些节点中删除以下划线开头的标签(例如 _User
)并用不带下划线的值替换它们,那么对 db.schema()
的调用不应再 return值。
你可以这样做...
MATCH (n:_User)
SET n:User
REMOVE n:_User
根据反馈更新了答案。您可以使用 APOC 执行类似的操作。
// get all labels that start with underscore
CALL db.labels()
YIELD label AS old_label
WHERE old_label STARTS WITH '_'
WITH old_label, substring(old_label, 1, length(old_label)) AS new_label
// match the nodes for one of the underscore labels
MATCH (n)
WHERE old_label IN labels(n)
WITH old_label, new_label, collect(n) AS relabel_nodes
// call removeLabels with the list of nodes and list od labels to remove
CALL apoc.create.removeLabels(relabel_nodes, [old_label])
YIELD node AS removed_label_node
// call addLabels with the new label to add
WITH removed_label_node, new_label
CALL apoc.create.addLabels(removed_label_node, [new_label])
YIELD node AS added_label_node
RETURN added_label_node
我有一个 Neo4j 数据库,其中每个节点都有以下划线开头的标签。
例如(:User,_User), (:Store,:_Store)
等
这些下划线标签是由 Spring Data Neo4j 生成的,现在我想去掉它们(call db.schema()
returns 它们作为模式中的一个单独节点)。
目标只得到(:User), (:Store)
.
有什么方法可以通过某些查询做到这一点吗?
如果您从这些节点中删除以下划线开头的标签(例如 _User
)并用不带下划线的值替换它们,那么对 db.schema()
的调用不应再 return值。
你可以这样做...
MATCH (n:_User)
SET n:User
REMOVE n:_User
根据反馈更新了答案。您可以使用 APOC 执行类似的操作。
// get all labels that start with underscore
CALL db.labels()
YIELD label AS old_label
WHERE old_label STARTS WITH '_'
WITH old_label, substring(old_label, 1, length(old_label)) AS new_label
// match the nodes for one of the underscore labels
MATCH (n)
WHERE old_label IN labels(n)
WITH old_label, new_label, collect(n) AS relabel_nodes
// call removeLabels with the list of nodes and list od labels to remove
CALL apoc.create.removeLabels(relabel_nodes, [old_label])
YIELD node AS removed_label_node
// call addLabels with the new label to add
WITH removed_label_node, new_label
CALL apoc.create.addLabels(removed_label_node, [new_label])
YIELD node AS added_label_node
RETURN added_label_node