首页 > 解决方案 > Neo4j - 批量编辑节点属性 - 即批量编辑所有键(n)

问题描述

我正在尝试执行一些数据清理,并且正在寻找一种方法来批量编辑一组节点上的所有属性键。就我而言,我想将所有键(n)设为大写并用“_”替换空格,而不管列名如何。

以下集合执行此操作,但假设您知道密钥的特定名称。

MATCH (c:Category)
UNWIND keys = collKeys
SET c.COMPANY = c.Company   
REMOVE c.Company
return c limit 1000

以下构建了当前键的列表,然后构建了我想要的标签。我只是不确定如何正确调整 SET。我正在尝试找到一种方法来对我所有的键(c)执行以下操作

//SET c.REPLACE(toUPPER(c.Company)," ", " ") = REPLACE(toUPPER(c.Company)," ", " ")

MATCH (c:Category)
UNWIND keys(c) as collKeys
WITH DISTINCT collKeys
WITH collKeys, REPLACE(toUPPER(collKeys)," ", "_") as collUPPERKeys
WHERE collKeys <> 'source'
SET c.collUPPERKeys = REPLACE(toUPPER(c.collKeys)," ", "_")    //<-- this is where I'm struggling as c.collUPPERKeys doesn't make sense
REMOVE c.collKeys
return  c

我意识到最佳做法是在导入时执行此操作,但我目前还无法访问该代码,尽管我打算在数据加载时执行此操作。

提前谢谢了

编辑-是否有一个 apoc 函数可以做到这一点?

标签: neo4jcypher

解决方案


您将需要 APOC 来创建动态属性:查看以下帖子:https ://dzone.com/articles/neo4j-dynamically-add-propertyset-dynamic-property

CALL apoc.create.setProperty(c, collUPPERKeys, replace(...))

同样,要删除动态属性,您也需要 APOC。

CALL apoc.create.removeProperties(c, collKeys)

产量节点

如果我们把它们放在一起:

MATCH (c:Category)
WITH c 
UNWIND keys(c) as collKeys
WITH collKeys,c
WITH collKeys, REPLACE(toUPPER(collKeys)," ", "_") as collUPPERKeys,c
WHERE collKeys <> 'source'
// set dynamic properties
CALL apoc.create.setProperty(c, collUPPERKeys, replace(toUPPER(c.collKeys)," ", "_")) YIELD node as foo
// remove dynamic properties
CALL apoc.create.removeProperties(c, [collKeys]) YIELD node
return c

推荐阅读