Neo4j cypher-跨同一标签的所有节点添加/删除属性

Neo4j cypher-跨同一标签的所有节点添加/删除属性,neo4j,cypher,Neo4j,Cypher,使用以下示例数据: node1:Person{id:1,name:'NameOne'} node2:Person{id:2,name:'NameTwo',年龄:42} 问题是:是否可以将label Person的所有节点的属性标准化到列表['id'、'name'、'age'、'lastname'],以便将缺少的属性添加到具有默认空值且仅使用密码的节点 我使用apoc.map.merge({first},{second})生成值的过程进行了绑定,如下所示: match (p:Person) c

使用以下示例数据:


node1:Person{id:1,name:'NameOne'}

node2:Person{id:2,name:'NameTwo',年龄:42}

问题是:是否可以将label Person的所有节点的属性标准化到列表['id'、'name'、'age'、'lastname'],以便将缺少的属性添加到具有默认空值且仅使用密码的节点

我使用
apoc.map.merge({first},{second})生成值的过程进行了绑定,如下所示:

match (p:Person) 
call apoc.map.merge(proeprties(p),{id:'',name:'',age:'',lastname:''}) yield value 
return value
但是我得到了这个错误:

没有为注册名为
apoc.map.merge
的过程 这个数据库实例。请确保您已经拼写了程序 正确命名并正确部署过程

虽然我可以确认我有apoc

bash-4.3# ls -al /var/lib/neo4j/plugins/apoc-3.1.0.3-all.jar 
-rw-r--r--    1 root     root       1319762 Dec 14 02:19 /var/lib/neo4j/plugins/apoc-3.1.0.3-all
它显示在apoc帮助中

neo4j-sh (?)$ call apoc.help("map.merge");
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| type       | name                 | text                                                                              | signature                                                 | roles  | writes |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "function" | "apoc.map.merge"     | "apoc.map.merge(first,second) - merges two maps"                                  | "apoc.map.merge(first :: MAP?, second :: MAP?) :: (MAP?)" | <null> | <null> |
| "function" | "apoc.map.mergeList" | "apoc.map.mergeList([{maps}]) yield value - merges all maps in the list into one" | "apoc.map.mergeList(maps :: LIST? OF MAP?) :: (MAP?)"     | <null> | <null> |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows
47 ms
neo4j sh(?)$callapoc.help(“map.merge”);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|键入|名称|文本|签名|角色|写入|
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|“函数”|“apoc.map.merge”|“apoc.map.merge(第一,第二)-合并两个映射”|“apoc.map.merge(第一::映射?,第二::映射?:(映射?)||
|函数“|”apoc.map.mergeList“|”apoc.map.mergeList([{maps}])产生值-将列表中的所有映射合并为一个“|”apoc.map.mergeList(映射::映射的列表?::(映射?)||
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2排
47毫秒

请注意,现在这些都是函数,因此不需要使用类似于调用或生成的过程来调用它们。这应该起作用:

match (p:Person) 
RETURN apoc.map.merge(properties(p),{id:'',name:'',age:'',lastname:''})
请记住,此查询只会影响返回的内容,因为您没有使用SET更新节点属性

您可以使用
+=
操作符来更新节点的属性,而不是使用apoc.map.merge:

match (p:Person)
set p += {id:'',name:'',age:'',lastname:''}
请记住,this和apoc.map.merge都将替换现有值,因此您将为所有人员的id、姓名、年龄和姓氏留空

目前,我认为Neo4j或APOC中没有在保留现有属性而不是替换属性的同时合并属性的功能。也就是说,您可以使用一些变通方法

COALESCE()是一个非常有用的函数,因为它允许您提供默认值,以便在值为null时使用

例如,如果属性为null,则可以使用提供的空字符串作为默认值来更新all:person的属性:

match (p:Person)
with {id:COALESCE(p.id, ''), name:COALESCE(p.name, ''), age:COALESCE(p.age, ''), 
  lastname:COALESCE(p.lastname, '')} as newProps
set p += newProps