Я пытаюсь использовать периодическую итерацию APOC для внесения изменений в модель данных графа. Я использую команду LOAD CSV
для разбора текстовых данных и загрузки статей в neo4j 3.4.4.
USING PERIODIC COMMIT 5000 LOAD CSV WITH HEADERS
FROM 'file:///article.txt' as r FIELDTERMINATOR '\t'
MATCH (a:Article {PMID: toInt(r.PMID)})
WITH a, toLower(r.ArticleTitle) as text
WITH a, reduce(t=text, delim in [",",".","!","?",'"',":",";","'","(",")","[","]","{","}"] | replace(t,delim," ")) as text
WITH a, reduce(t=text, delim in ["/", "\\"] | replace(t, delim, " ")) as text with a, filter(w in split(text, " ") where length(w) > 2) as words SET a.words = words;
Я могу создать узлы Word с помощью следующей команды, которая довольно чувствительна к объему загружаемых данных. Текущая база данных насчитывает 83 000 статей, запрос выполняется за несколько минут.
MATCH (a:Article) where exists(a.words)
WITH a
FOREACH (word in a.words|
MERGE (w:Word {Name: word})
MERGE (a) -[r:contains]-> (w)
ON CREATE SET r.f = 1
ON MATCH SET r.f = r.f + 1
)
Поэтому я попытался использовать процедуру apoc.periodic.iterate
для небольших пакетов данных. Поскольку процедура APOC не допускает кавычек в запросе, я сначала создаю массив отфильтрованных слов, которые, следовательно, используются для генерации узлов и отношений.
CALL apoc.periodic.iterate('MATCH (a:Article) WHERE EXISTS(a.words) RETURN a as art','WITH {art} as a FOREACH (word in a.words | MERGE (w:Word {Name: word}) MERGE (a) -[r:contains]-> (w) ON CREATE SET r.f = 1 ON MATCH SET r.f = r.f + 1)', {batchSize:1000, parallel:true})
Приведенный выше запрос не выполняется в некоторых пакетах со следующим сообщением:
batches total timeTaken committedOperations failedOperations failedBatches retries errorMessages batch operations wasTerminated
83 1233 2 573 82 82 0
{
}
{
"total": 83,
"committed": 1,
"failed": 82,
"errors": {
"java.lang.NullPointerException": 82
}
}
{
"total": 1233,
"committed": 573,
"failed": 82,
"errors": {
}
}
false
Данные являются общедоступными, но они слишком велики, чтобы их можно было разделить здесь, и я не могу понять, какая запись не удалась, кроме того, все записи работали с чистым запросом CYPHER
.