以下示例数据:
node1:Person {id:1,name:'NameOne'}
node2:Person {id:2,name:'NameTwo',年龄:42}
问题是:是否可以将标签Person的所有节点上的属性标准化为列表['id','name','age','lastname'],以便将缺少的属性添加到具有默认值的节点空值并仅使用cypher?
我使用apoc.map.merge({first},{second}) yield value
程序绑定如下:
match (p:Person)
call apoc.map.merge(proeprties(p),{id:'',name:'',age:'',lastname:''}) yield value
return value
然而我收到了这个错误:
没有注册名称为
apoc.map.merge
的程序 这个数据库实例。请确保你拼写了这个程序 正确命名并正确部署该过程。
虽然我可以确认我已经到位了
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.help
中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
答案 0 :(得分:1)
请注意,现在这些都是函数,因此您无需像使用CALL或YIELD那样调用它们。这应该有效:
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:''}
请注意,这个和apoc.map.merge都将替换现有值,因此您将为所有人清除id,name,age和lastname。
目前我不相信Neo4j或APOC中的功能可以合并属性,同时保留现有属性而不是替换。也就是说,您可能会使用一些变通方法。
COALESCE()是一个很有用的函数,因为它允许你提供默认值,以便在值为null时使用。
例如,您可以使用它来更新所有人的属性:Persons,如果属性为null,则使用提供的空字符串作为默认值:
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