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