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

Neo4j Cypher合并具有相同属性的节点并收集其他属性,neo4j,merge,cypher,neo4j-apoc,Neo4j,Merge,Cypher,Neo4j Apoc,我有这个结构的节点 (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') 属性“match”是唯一的(match的ID),但有多个名称相同的“nome”。 我想合并所有具有

我有这个结构的节点

(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')
属性“match”是唯一的(match的ID),但有多个名称相同的“nome”。 我想合并所有具有相同“nome”的节点,并创建一个不同“match”的集合,如下所示

(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合并节点,但随后我对节点列表进行映射转换,以获得一个
匹配的数组
,并在合并的节点上设置它

我不知道您是否有大量的
Giocatore
节点,因此此查询可能会执行OutOfMemory异常,因此您必须批处理查询。例如,您可以将第一行替换为
匹配(n:Giocatore),其中n.nome以“A”开头
并对每个字母重复它,或者您也可以使用
apoc.periodic.迭代过程:

    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

我尝试了查询,但返回了一个错误:“Neo.ClientError.Statement.EntityNotFound:id为1199381的节点在此事务中已被删除”我已更新了查询(即在apoc过程中删除NDOE之前计算匹配数组)