почему я использую этот сбой импорта CSV-данных cql?

#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:

Несколько вещей, которые нужно попробовать:

  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
      
  2. Возможно, вы захотите повысить производительность, создав индексы на:

    • :user(value)
    • :device(value)
  3. Используйте PROFILE для анализа плана выполнения, сгенерированного на основе вашего Cypher.

Комментарии:

1. Спасибо за совет! Я пробовал ваш запрос, время выполнения вашего кода, похоже, значительно не улучшилось (до: 33 минуты после: 31 минута), но ваш код действительно намного проще моего.

2. Вы добавили индексы?

3. Извините, я не добавлял индексы. С индексами он значительно улучшился (до: 33 минуты после: 2 минуты), ваш совет мне очень помог, большое вам спасибо!