2017-04-25 118 views
0

我创建了很多带有几个属性值为NULL的节点(也许它的值是“”),现在我想删除所有属性。我无法使用其属性名称逐步删除属性。 更新1: 当我呼吁浏览器match(u:User) return properties(u),它返回: enter image description here通过Cypher删除不知道属性名称的节点的属性

+0

'null'永远不会是Neo4j中的属性值,这表示不存在。你可以显示你用来检测这些有问题的属性的查询吗? – InverseFalcon

+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 
+0

好的!非常感谢! –