Запрос загрузки csv не завершается даже после 12 часов - PullRequest
0 голосов
/ 17 января 2019

Я давно пользуюсь Neo4j. Я выполнил этот запрос раньше, чем мой компьютер сломался 7 дней назад и почему-то не смог его запустить. Мне нужно создать базу данных графа из CSV банковских транзакций. Исходный набор данных содержит около 5 миллионов строк и около 60 столбцов.

Я использовал этот запрос, начиная с «Экспортировать CSV из реальных данных» демо Николь Уайт:

USING PERIODIC COMMIT 1000
LOAD CSV WITH HEADERS FROM "file:///Transactions_with_risk_scores.csv" AS line
WITH DISTINCT line, SPLIT(line.VALUE_DATE, "/") AS date
WHERE line.TRANSACTION_ID IS NOT NULL AND line.VALUE_DATE IS NOT NULL
MERGE (transaction:Transaction {id:line.TRANSACTION_ID})
SET transaction.base_currency_amount =toInteger(line.AMOUNT_IN_BASE_CURRENCY),
transaction.base_currency = line.BASE_CURRENCY,
transaction.cd_code = line.CREDIT_DEBIT_CODE,
transaction.txn_type_code = line.TRANSACTION_TYPE_CODE,
transaction.instrument = line.INSTRUMENT,
transaction.region= line.REGION,
transaction.scope = line.SCOPE,
transaction.COUNTRY_RISK_SCORE= line.COUNTRY_RISK_SCORE,
transaction.year = toInteger(date[2]),
transaction.month = toInteger(date[1]),
transaction.day = toInteger(date[0]);

Я пытался:

  1. Использование LIMIT 0 перед запуском запроса в соответствии с предложением Micheal Hunger в сообщении о «Загрузка больших наборов данных».

  2. Использовал одиночное MERGE на оператор (это первое слияние, и нужно использовать еще 4 слияния), как это было предложено Майклом снова в другой записи .

  3. Пробовал CALL apoc.periodic.iterate и apoc.cypher.parallel, но не работает с LOAD CSV (похоже, работает только с запросами MERGE и CREATE без LOAD CSV). Я получаю следующую ошибку с CALL apoc.periodic.iterate (""): Neo.ClientError.Statement.SyntaxError: Неверный ввод 'f': ожидаемый пробел, '.', Метки узла, '[', "= ~", IN, STARTS, ENDS, CONTAINS, IS, '^', '*' , '/', '%', '+', '-', '=', '~', "<>", "! =", '<', '>', "<=", "> = ", AND, XOR, OR, ',' или ')' (строка 2, столбец 29 (смещение: 57))

  4. Увеличен максимальный размер кучи до 16 ГБ, поскольку у моего ноутбука 16 ГБ ОЗУ Кстати, мне было трудно написать этот пост, так как я попытался запустить его снова с «PROFILE», и он все еще работает с часа.

Требуется помощь для загрузки запроса из этого набора данных с 5 миллионами строк. Любая помощь будет высоко оценена. Спасибо заранее! Я использую Neo4j 3.5.1 на ПК.

1 Ответ

0 голосов
/ 17 января 2019
  1. НАИБОЛЕЕ ВАЖНО: Создать Индекс / Ограничение для ключевого свойства.

СОЗДАТЬ ОГРАНИЧЕНИЕ НА (t: транзакция) ASSERT t.id УНИКАЛЬНО;

  1. Не устанавливайте максимальный размер кучи на полную системную память. Установите 50% .

  2. Попробуйте ON CREATE SET вместо SET .

  3. Вы также можете использовать apoc.periodic.iterate для загрузки данных, но USING PERIODIC COMMIT также подойдет.

  4. Важно, что если вы 'ИСПОЛЬЗУЕТЕ PERIODIC COMMIT', а запрос не завершается или не хватает памяти, скорее всего, это связано с использованием Distinct. Избегайте различий, поскольку MERGE будет обрабатывать повторяющиеся транзакции.

ПРИМЕЧАНИЕ: (Если вы используете apoc.periodic.iterate для MERGE узлов / отношений с параметром parallel = true , то произойдет сбой с ИСКЛЮЧЕНИЕМ NULL POINTER. используйте его осторожно)

Редактор вопроса: удаление отличительной строки в 3-й строке для узла транзакции и повторный запуск запроса сработали!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...