我创建了许多具有一些属性的节点,其值为NULL(可能其值为"")现在我想删除所有属性。我无法使用其属性名称删除分步属性。
更新1:
当我在浏览器上调用match(u:User) return properties(u)
时,它会返回:
enter image description here
答案 0 :(得分:0)
啊,好吧,正如你猜测的那样,这些是空字符串值。
我们需要一个图表范围的查询来查找具有空字符串属性的节点。这将不得不触及所有节点的所有属性,因此在较大的图形上可能会很昂贵。
至于动态删除这些,Cypher对这种操作没有很大的支持。但是,如果您可以安装APOC Procedures,那么我们可以轻松清除这些属性。
我在此查询中使用的方法是在节点的键上使用过滤器/提取,并创建一个到null
的键的配对作为所有键的两元素列表空字符串值。
然后我们将使用apoc.map.fromPairs()
生成这些键的映射到空值,然后在节点上使用+=
操作,这将有效地将所有这些映射值应用于节点的属性删除这些属性,因为将属性设置为null
与删除属性相同。
MATCH (u:User) // if you want this run for all nodes, remove the label
WITH u, [key in keys(u) WHERE u[key] = '' | [key, null]] as nullifiers
WHERE size(nullifiers) <> 0
WITH u, apoc.map.fromPairs(nullifiers) as nullifyMap
SET u += nullifyMap
答案 1 :(得分:0)
我偶然发现了这种寻求优雅解决方案的方法。要进一步优化这样的查询,您可以将其包装在APOC过程中,以进行并行批处理,如下所示:
CALL apoc.periodic.iterate(
"MATCH (u:User) RETURN u",
"WITH u, [key in keys(u) WHERE o[key] = '' | [key, null]] as nullifiers WHERE size(nullifiers) <> 0 WITH u, apoc.map.fromPairs(nullifiers) as nullifyMap SET u += nullifyMap",
{batchSize:30000, parallel:true, iterateList:true});