neo4j - 合并地图密码列表中的地图值
问题描述
我有一个List<Map>
具有以下结构的可变长度:
[{name: 'MANAGE_USERS', crud: ['READ']}, {name: 'MANAGE_USERS', crud: ['READ', 'CREATE','UPDATE','DELETE']}, {name: 'MANAGE_SITES', crud: ['READ']}]
我希望能够编写一个 Cypher 查询,当遇到相同的键时返回一个List<Map>
合并值,如下所示:crud
name
[{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
程序对其进行整理,但到目前为止无济于事。
感谢所有愿意提供帮助的人!
解决方案
结合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"
}
]