#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