Cypher 合并具有相同 属性 的节点并收集其他 属性
Cypher merge nodes with same property and collected the other property
我有这种结构的节点
(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 库,但没有任何效果。
有什么想法吗?
你能试试这个查询吗:
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
我有这种结构的节点
(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 库,但没有任何效果。 有什么想法吗?
你能试试这个查询吗:
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