首页 > 解决方案 > 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 库,但没有任何效果。任何的想法?

标签: neo4jmergecypherneo4j-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

推荐阅读