Сайфер объединяет узлы с тем же свойством и собирает другое свойство - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть узлы с этой структурой

(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» является уникальным (идентификаторы соответствия), хотя существует несколько «nome» с одинаковыми именами. Я хочу объединить все узлы с одним и тем же «номом» и создать коллекцию разных «совпадений», как это

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

Я тоже пытался с библиотекой apoc, но ничего не работает. Есть идеи?

1 Ответ

0 голосов
/ 06 сентября 2018

Можете ли вы попробовать этот запрос:

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
...