首页 文章

Cypher合并具有相同属性的节点并收集其他属性

提问于
浏览
0

我有这种结构的节点

(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'具有相同的名称 . 我想将所有节点与相同的'nome'合并,并像这样创建一个不同'匹配'的集合

(nome:'Del Piero', match:[45343,18235], nazionale:'ITA')
(nome:'Messi', match:'65324', nazionale:'ARG')

我也尝试过apoc库,但没有任何效果 . 任何的想法?

1 回答

  • 0

    你能试试这个查询:

    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来合并节点,但后来我在节点列表上进行了 Map 转换,得到了一个 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
    

相关问题