合并地图密码列表中的地图值

Merge map values in list of maps cypher

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

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

我希望能够编写一个 Cypher 查询,在遇到相同的 name 键时,returns 一个具有合并 crud 值的 List<Map>,如下所示:

[{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 程序来解决它,但到目前为止无济于事。

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

结合 UNWINDCOLLECT 和一些 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

returns 期望的输出

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

一种不依赖 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 item['name'] AS name, item['crud'] AS crud
UNWIND crud AS action
WITH name, collect(DISTINCT action) AS actions 
RETURN collect({name: name, crud: actions}) AS output