我有这种结构的节点
(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”是唯一的(匹配的ID),而有多个“ nome”具有相同的名称。 我想将所有节点合并为相同的“ nome”,并创建一个不同的“ match”集合,像这样
(nome:'Del Piero', match:[45343,18235], nazionale:'ITA')
(nome:'Messi', match:'65324', nazionale:'ARG')
我也尝试过apoc库,但是没有任何效果。 有想法吗?
答案 0 :(得分: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合并节点,但是随后我在节点列表上进行了映射转换,以拥有一个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