neo4j - Cypher 合并具有相同属性的节点并收集其他属性
问题描述
我有这种结构的节点
(g:Giocatore { nome, match, nazionale})
(nome:'Del Piero', match:'45343', nazionale:'ITA')
(nome:'Messi', match:'65324', nazionale:'ARG')
(nome:'Del Piero', match:'18235', nazionale:'ITA')
属性“匹配”是唯一的(匹配的 ID),而有多个具有相同名称的“名称”。我想合并所有具有相同“名称”的节点并创建一个不同的“匹配”集合,像这样
(nome:'Del Piero', match:[45343,18235], nazionale:'ITA')
(nome:'Messi', match:'65324', nazionale:'ARG')
我也尝试过使用 apoc 库,但没有任何效果。任何的想法?
解决方案
你可以试试这个查询:
MATCH (n:Giocatore)
WITH n.nome AS nome, collect(n) AS node2Merge
WITH node2Merge, extract(x IN node2Merge | x.match) AS matches
CALL apoc.refactor.mergeNodes(node2Merge) YIELD node
SET node.match = matches
在这里,我使用 APOC 来合并节点,但随后我在节点列表上进行映射转换以拥有 的数组match
,并将其设置在合并节点上。
我不知道你是否有很多Giocatore
节点,所以这个查询可能会出现 OutOfMemory 异常,所以你必须批量查询。例如,您可以将第一行替换为MATCH (n:Giocatore) WHERE n.nome STARTS WITH 'A'
并对每个字母重复,或者您也可以使用以下apoc.periodic.iterate
过程:
CALL apoc.periodic.iterate(
'MATCH (n:Giocatore) WITH n.nome AS nome, collect(n) AS node2Merge RETURN node2Merge, extract(x IN node2Merge | x.match) AS matches',
'CALL apoc.refactor.mergeNodes(node2Merge) YIELD node
SET node.match = matches',
{batchSize:1000,parallel:true,retries:3,iterateList:true}
) YIELD batches, total
推荐阅读
- split - 如何获取由特定字符分隔的字符串的一部分?
- wso2-am - 登录 WSO2 API Manager 2.0.0 Carbon 控制台后显示“403 禁止”
- javascript - Javascript 功能在主页上运行,但在第二页上停止
- javascript - 如何测试不导出任何内容的常规 JavaScript 代码?
- python - swaplevel() 和 reorder_levels() 有什么区别?
- postgresql - 邮递员。在一条 SQL 语句中插入不存在的行并更新已存在的行
- react-native - 不为 Android 构建,仅在实现 react-native-maps 后为 IOS
- python - 从字典中删除嵌套值列表中的特定值
- azure - Azure 自动化是否支持写入信息?
- amazon-web-services - 验证 ALB + AWS Cognito 时出现 500 错误