Neo4j загружает csv в течение очень долгого времени

#neo4j #cypher #load-csv

#neo4j #cypher #загрузка-csv

Вопрос:

Привет всем на Stackoverflow,

У меня есть простой запрос для загрузки csv, но загрузка браузера занимает много времени и по-прежнему показывает знак загрузки.

Вот мой запрос:

 LOAD CSV WITH HEADERS FROM "file:///ratings_small.csv" AS line 
WITH line MERGE (u:User{name:line.userId}) 
MERGE (m:Movie {movieId:line.movieId}) 
MERGE (u)-[r:RATED {rating:line.rating}]->(m) 
RETURN u, m, r
 

Я не вижу ошибки в коде..

ratings_small.csv содержит следующие столбцы:

Идентификатор пользователя Идентификатор фильма отметка времени рейтинга

1 31 2.5 1260759144

1 1029 3 1260759179

1 1061 3 1260759182

1 1129 2 1260759185

1 1172 4 1260759205

Существует 100 004 записей.

С уважением, Анна

Ответ №1:

Я полагаю, что у вас нет индексов как для:User (name), так и для :Movie(MovieID).

Выполните два следующих запроса и повторите свою команду LOAD CSV, затем она должна импортировать ее через пару секунд :

 CREATE CONSTRAINT ON (u:User) ASSERT u.name IS UNIQUE;
CREATE CONSTRAINT ON (m:Movie) ASSERT m.moveId IS UNIQUE;
 

Во-вторых, я полагаю, что пользователи оценивают фильм только один раз, поэтому СЛИЯНИЕ отношений не обязательно должно происходить с помощью свойства, вы можете изменить свой запрос следующим образом :

 LOAD CSV WITH HEADERS FROM "file:///ratings_small.csv" AS line 
WITH line MERGE (u:User{name:line.userId}) 
MERGE (m:Movie {movieId:line.movieId}) 
MERGE (u)-[r:RATED]->(m)
SET r.rating = line.rating
RETURN u, m, r
 

Чтобы Neo4j не пытался обработать полный CSV-файл за одну транзакцию, вы можете указать размер пакета транзакционных операций (чтобы избежать проблем с памятью) следующим образом :

 USING PERIODIC COMMIT 2000
LOAD CSV WITH HEADERS FROM "file:///ratings_small.csv" AS line 
WITH line MERGE (u:User{name:line.userId}) 
MERGE (m:Movie {movieId:line.movieId}) 
MERGE (u)-[r:RATED]->(m)
SET r.rating = line.rating
RETURN u, m, r
 

Наконец, я сомневаюсь, что у вас есть какое-либо приложение или даже браузер Neo4j, который может визуализировать все сразу, поэтому я бы ничего не возвращал из запроса LOAD CSV :

 USING PERIODIC COMMIT 2000
LOAD CSV WITH HEADERS FROM "file:///ratings_small.csv" AS line 
WITH line MERGE (u:User{name:line.userId}) 
MERGE (m:Movie {movieId:line.movieId}) 
MERGE (u)-[r:RATED]->(m)
SET r.rating = line.rating
 

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

1. Спасибо, я добавил ограничения, теперь у меня такая ошибка: Neo.DatabaseError. Инструкция. Сбой выполнения — пространство кучи java

2. Я установил следующим образом: dbms.memory.heap.initial_size=5G dbms.memory.heap.max_size=5G

3. dbms.memory.pagecache.size= 2G

4. УЗЛЫ (:Movie, :User) загружаются нормально один за другим. Теперь я запускаю запрос: ——-> С ПОМОЩЬЮ ПЕРИОДИЧЕСКОЙ ФИКСАЦИИ 2000 ЗАГРУЖАЮ CSV С ЗАГОЛОВКАМИ ИЗ «file:///ratings_small.csv» В ВИДЕ строки С совпадением строк (u:User{userId:line.userId}), (m:Movie{MovieID:line.MovieID}) СОЗДАТЬ (u) -[r:RATED ]->(m) УСТАНОВИТЬ r.rating = line.rating ——> Выводит: выполнение запросов, использующих периодические коммиты в открытой транзакции, невозможно

5. Удалите WITH line