#neo4j #cypher #cql
#neo4j #шифр #cql
Вопрос:
Я пытаюсь импортировать данные отношений, используя CSV-файл, который содержит 25000 строк, затем я использую этот шифр:
USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'http://127.0.0.1:88/static/relations/261.csv' AS line
MATCH (a:user{value:line.userId}),(b:device{value:line.deviceId})
MERGE (a)-[rel:myrelname]->(b)
WITH rel, COALESCE(rel.eventOccurTime, []) line.eventOccurTime AS eventOccurTime
UNWIND eventOccurTime as r0
WITH rel, collect(distinct r0) AS unique
set rel.eventOccurTime= unique ,rel.business_name='data-test'
через 30 минут я получаю эту ошибку:
[Neo.DatabaseError.Инструкция.Сбой выполнения]: Сброс соединения, ссылка 0b8a3600-d715-44bf-8c5b-4260edeab 459.
как я могу это исправить?
Комментарии:
1. что произойдет, если вы сделаете это с меньшим набором данных? хранит ли он ваши данные так, как должен?
2. отношения сохранены, но свойства отношений не сохранены. Когда объем моих CSV-данных равен 5000 и CQL успешно выполняется без ошибок, свойства могут быть сохранены. Но в другом случае я не уверен.
3. Обратите внимание, что когда вы РАЗМАТЫВАЕТЕ пустой массив, остальная часть вашего запроса больше не выполняется. Может ли это быть объяснением?
Ответ №1:
Несколько вещей, которые нужно попробовать:
-
Упростите (и ускорьте) запрос. Нет необходимости разматывать, а затем заново собирать отдельные элементы списка. И нет необходимости создавать временные списки или добавлять к ним дополнения, если это действительно не необходимо.
USING PERIODIC COMMIT 500 LOAD CSV WITH HEADERS FROM 'http://127.0.0.1:88/static/relations/261.csv' AS line MATCH (a:user{value: line.userId}), (b:device{value: line.deviceId}) MERGE (a)-[rel:myrelname]->(b) SET rel.business_name='data-test', rel.eventOccurTime = CASE WHEN rel.eventOccurTime IS NULL THEN [line.eventOccurTime] WHEN line.eventOccurTime IN rel.eventOccurTime THEN rel.eventOccurTime ELSE rel.eventOccurTime line.eventOccurTime END
-
Возможно, вы захотите повысить производительность, создав индексы на:
:user(value)
:device(value)
-
Используйте PROFILE для анализа плана выполнения, сгенерированного на основе вашего Cypher.
Комментарии:
1. Спасибо за совет! Я пробовал ваш запрос, время выполнения вашего кода, похоже, значительно не улучшилось (до: 33 минуты после: 31 минута), но ваш код действительно намного проще моего.
2. Вы добавили индексы?
3. Извините, я не добавлял индексы. С индексами он значительно улучшился (до: 33 минуты после: 2 минуты), ваш совет мне очень помог, большое вам спасибо!