【问题标题】:Cypher - Remove all properties with a particular valueCypher - 删除具有特定值的所有属性
【发布时间】:2023-08-28 16:12:01
【问题描述】:

我正在寻找一种方法来删除数据库中任何节点的每个属性,使用 Cypher 具有特定值。

上下文
我从具有大量 NULL 值的关系表中获得了一个 csv 批量文件。 LOAD CSV 将它们作为值。删除它们(在 csv 文件中用空的 '' 替换它们)会导致相同的问题(没有值的属性)。尝试了许多(许多)Cypher 操作来丢弃 NULL 值,但没有任何效果。

谷歌搜索也找不到文档中的任何内容。这可以仅使用 Cypher 来完成吗?在我看来(还)不支持。

谢谢。

【问题讨论】:

  • 您不知道属性名称吗?无论你用空字符串替换空值时做了什么(你必须以某种方式匹配正确的节点和属性),你能不能再做一次,但用REMOVE n.property而不是SET n.property = ''
  • 我将 csv 文件中的 'NULL' 替换为 '' (查找并替换)。我说也许 Cypher 检测到空字符串并跳过相应的属性,但事实并非如此。
  • 所以你想删除任何节点上的任何属性,它是一个空字符串?

标签: neo4j cypher


【解决方案1】:

这个怎么样(当你知道属性名称时):

MATCH (n:Label)
WHERE n.property = ''
REMOVE n.property;

MATCH (u:User) 
WHERE u.age = '' 
SET u.age = null;

如果您知道这些列在您的导入中,您可以执行类似的操作

load csv with headers from "" as line
with line, case line.foo when '' then null else line.foo end as foo
create (:User {name:line.name, foo:foo})

它不会创建带有 null 的属性。

对于数值来说,toInt() 和 toFloat() 在像 '' 这样的不可解析值上返回 null 会更容易。

【讨论】:

  • 栏目很多,每栏都很难。不过既然没有别的办法,那我就接受了。谢谢@迈克尔。顺便说一句,我感谢您在 SO 和 Google 小组中所做的显着努力。
  • 使用您选择的编程语言循环浏览 CSV 的标题行并生成必要的 CASE 语句。
【解决方案2】:

不,仅使用 chypher 是无法做到这一点的。我想你已经看过the way to do it via REST。这是目前最好的解决方案。

【讨论】:

  • 不,我还没有玩过 REST 请求,但这并没有回答问题。如何指定要删除的属性的值?例如。删除所有以“foo”为值的属性?
  • 我认为问题在于删除具有特定值的属性,无论它们位于哪个节点上,而不是删除节点上的所有属性。要使用密码删除节点 n 上的所有属性,您可以使用 SET n = {}