首页 > 解决方案 > 合并地图密码列表中的地图值

问题描述

我有一个List<Map>具有以下结构的可变长度:

[{name: 'MANAGE_USERS', crud: ['READ']}, {name: 'MANAGE_USERS', crud: ['READ', 'CREATE','UPDATE','DELETE']}, {name: 'MANAGE_SITES', crud: ['READ']}] 

我希望能够编写一个 Cypher 查询,当遇到相同的键时返回一个List<Map>合并值,如下所示:crudname

[{name: 'MANAGE_USERS', crud: ['READ', 'CREATE','UPDATE','DELETE']}, {name: 'MANAGE_SITES', crud: ['READ']}] 

另一个例子:

[{name: 'MANAGE_USERS', crud: ['READ']},{name: 'MANAGE_SITES', crud: ['UPDATE']}, {name: 'MANAGE_USERS', crud: ['READ','DELETE']}, {name: 'MANAGE_SITES', crud: ['CREATE']}] 

期望的输出:

[{name: 'MANAGE_USERS', crud: ['READ', 'DELETE']},{name: 'MANAGE_SITES', crud: ['UPDATE', 'CREATE']}] 

我不在乎crud元素的顺序。

我正在尝试使用apoc程序对其进行整理,但到目前为止无济于事。

感谢所有愿意提供帮助的人!

标签: neo4jcypher

解决方案


结合UNWIND,COLLECT和一些apoc魔法会让你到达那里:

WITH 
[{name: 'MANAGE_USERS', crud: ['READ']},
 {name: 'MANAGE_SITES', crud: ['UPDATE']}, 
 {name: 'MANAGE_USERS', crud: ['READ','DELETE']}, 
 {name: 'MANAGE_SITES', crud: ['CREATE']}
] AS input
UNWIND input AS item
WITH {
        name:item.name,
        crud:apoc.coll.toSet(
               apoc.coll.flatten(
                 COLLECT(item.crud)
               )
             )
       } AS item
RETURN COLLECT(item) AS output

返回所需的输出

output
-----------
[
{
  "crud": [
    "READ",
    "DELETE"
  ],
  "name": "MANAGE_USERS"
}
,
{
  "crud": [
    "UPDATE",
    "CREATE"
  ],
  "name": "MANAGE_SITES"
}
]

推荐阅读