Neo4j 通过Cypher删除不知道属性名称的节点属性

Neo4j 通过Cypher删除不知道属性名称的节点属性,neo4j,cypher,Neo4j,Cypher,我用几个属性创建了多个节点,这些属性的值为NULL(可能它的值为“”),现在我想删除所有该属性。我无法删除属性名为的逐步属性。 更新1: 当我在浏览器上调用match(u:User)return properties(u)时,它返回: 啊,好吧,正如您所猜测的,这些是空字符串值 我们需要一个图形范围的查询来查找具有空字符串属性的节点。这必须涉及所有节点的所有属性,因此在较大的图形上可能会很昂贵 至于动态删除这些,Cypher对这种操作没有很好的支持。但是,如果您可以安装,那么我们可以轻松清除这些

我用几个属性创建了多个节点,这些属性的值为NULL(可能它的值为“”),现在我想删除所有该属性。我无法删除属性名为的逐步属性。 更新1: 当我在浏览器上调用
match(u:User)return properties(u)
时,它返回:

啊,好吧,正如您所猜测的,这些是空字符串值

我们需要一个图形范围的查询来查找具有空字符串属性的节点。这必须涉及所有节点的所有属性,因此在较大的图形上可能会很昂贵

至于动态删除这些,Cypher对这种操作没有很好的支持。但是,如果您可以安装,那么我们可以轻松清除这些属性

我在这个查询中使用的方法是对节点的键使用筛选/提取,并为所有具有空字符串值的键创建一个键对
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
MATCH(u:User)//如果要对所有节点执行此操作,请删除标签
使用u,[键入键(u),其中u[键]=''|[键,空]]作为空值化器
其中大小(零化器)为0
使用u,apoc.map.fromPairs(Nullifier)作为nullifyMap
设置u+=nullifyMap

啊,好吧,正如您所猜测的,这些是空字符串值

我们需要一个图形范围的查询来查找具有空字符串属性的节点。这必须涉及所有节点的所有属性,因此在较大的图形上可能会很昂贵

至于动态删除这些,Cypher对这种操作没有很好的支持。但是,如果您可以安装,那么我们可以轻松清除这些属性

我在这个查询中使用的方法是对节点的键使用筛选/提取,并为所有具有空字符串值的键创建一个键对
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
MATCH(u:User)//如果要对所有节点执行此操作,请删除标签
使用u,[键入键(u),其中u[键]=''|[键,空]]作为空值化器
其中大小(零化器)为0
使用u,apoc.map.fromPairs(Nullifier)作为nullifyMap
设置u+=nullifyMap

我在寻找优雅的解决方案时偶然发现了这一点。要优化这样的查询,甚至可以将其包装在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});
调用apoc.periodic.iterate(
“匹配(u:用户)返回u”,
“使用u,[输入键(u),其中o[键]=''|[键,空]]作为空值化器,其中大小(空值化器)为0,使用u,apoc.map.fromPairs(空值化器)作为空值化映射集u+=空值化映射”,
{batchSize:30000,parallel:true,iterateList:true});

我在寻找优雅的解决方案时偶然发现了这一点。要优化这样的查询,甚至可以将其包装在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});
调用apoc.periodic.iterate(
“匹配(u:用户)返回u”,
“使用u,[输入键(u),其中o[键]=''|[键,空]]作为空值化器,其中大小(空值化器)为0,使用u,apoc.map.fromPairs(空值化器)作为空值化映射集u+=空值化映射”,
{batchSize:30000,parallel:true,iterateList:true});

null
在Neo4j中永远不会是属性值,这表示不存在。能否显示用于检测这些有问题属性的查询?抱歉。其值为“”并带有字符串值。当我在浏览器上获取属性时,它返回的属性为空
null
在Neo4j中永远不会是属性值,这表示不存在。能否显示用于检测这些有问题属性的查询?抱歉。其值为“”并带有字符串值。当我在浏览器上获取属性时,它返回的属性为空