合并地图密码列表中的地图值
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
程序来解决它,但到目前为止无济于事。
感谢所有愿意提供帮助的人!
结合 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
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
我有一个 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
程序来解决它,但到目前为止无济于事。
感谢所有愿意提供帮助的人!
结合 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
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