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

时间:2016-12-31 03:15:58

标签: neo4j cypher

以下示例数据:

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

1 个答案:

答案 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