2014-10-28 4 views
3

Я пытаюсь создать отношения между двумя типами узлов, используя загруженный файл csv. Я уже создал все узлы Кино и Ключевые слова. Я также создал индексы на: Movie (название) и: Ключевое слово (слово).Neo4j создание отношений с использованием csv

Мой файл CSV выглядит следующим образом:

"название" | год | "слово" // заголовочный

"В диких условиях" | 2007 | "1990-х годов" // строка с заголовком, год и ключевое слово

"в диких условиях" | 2007 | "отказались от шины"

Мой запрос:

LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv 
FIELDTERMINATOR '|' 
MATCH (m:Movie {title:csv.title,year: toInt(csv.year)}), (k:Keyword {word:csv.word}) 
MERGE (m)-[:Has {weight:1}]->(k); 

Query работает около часа и показывает ошибку «Неизвестная ошибка». Какое избыточное описание ошибки.

Я думал, что это из-за 160K ключевых слов и более 1M фильмов и более 4M линий в csv. Итак, я сокращаю csv до одной строки, и он все еще работает около 15 минут без остановки.

В чем проблема? Как написать запрос для создания отношений между 2 уже созданными узлами?

Я также могу удалить все узлы и построить свою базу данных другим способом, но лучше не удалять все созданные узлы.

Примечание: У меня не должно быть проблем с оборудованием, потому что я использую Super PC с нашего факультета.

+1

* «избыточный» * Я не думаю, что это означает, что вы думаете, что это значит. – ADTC

ответ

3

Обязательно иметь указатели схемы, чтобы ускорить поиск начальных узлов. Перед запуском импорта сделать:

CREATE INDEX ON :Movie(title) 
CREATE INDEX ON :Keyword(word) 

Убедитесь, что показатели заполняются и онлайн (проверьте :schema команды).

реорганизовать Cypher команду на два запроса, чтобы использовать индексы - на данный момент индекс состоит только из метки и один свойство:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv 
FIELDTERMINATOR '|' 
MERGE (m:Movie {title:csv.title }) 
ON CREATE SET m.year = toInt(csv.year) 
MERGE (k:Keyword {word:csv.word}) 

второй проход над файлом

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/home/gondil/temp.csv" AS csv 
FIELDTERMINATOR '|' 
MATCH (m:Movie {title:csv.title }) 
MATCH (k:Keyword {word:csv.word}) 
MERGE (m)-[:Has {weight:1}]->(k); 
+0

Я выполнил: схема. Он вернулся Индексы ON: Ключевое слово (слово) ONLINE и ON: Фильмы (заголовок) ONLINE. Затем я выполнил ваш предложенный запрос на csv всего двумя строками, и он работает еще 15 минут +. Не могу понять, что не так. Я тестировал только, чтобы вернуть узлы, обнаруженные csv-файлом, и он занимает около 118 мс. – Gondil

+0

Теперь я смущен. Интерфейс браузера Neo говорит, что у меня есть: фильмы и: узлы ключевых слов, но что странно, это показывает, что у меня есть также: имеет rels. Поэтому некоторые должны быть созданы. Я пробовал некоторые очень примитивные запросы, которые возвращают мне один узел. Это заняло около 30 секунд, но это займет несколько мс. Некоторое выполнение этого запроса длится очень долго и происходит ошибка Неизвестная. Пример: Я попытался сделать одно отношение не из csv, просто объединив 2 узла, и это не было сделано. Я действительно в отчаянии. Вы знаете, что может быть не так с этим?Я хотел бы написать вам сообщение не вне темы. – Gondil

+0

Здравствуйте, я вернусь к этому через долгое время, я удалил все в своей базе данных и начал сначала использовать периодический запрос фиксации, который вы опубликовали. Я позволил ему бежать и выходить из моего ноутбука, но забыл, что ему не поспать через некоторое время. Когда я вернусь, появилась Неизвестная ошибка, но когда я посмотрел на интерфейс webadmin, были некоторые узлы, и что было странным, счет увеличивался. И все еще растет. Теперь, когда я выполняю запрос для подсчета узлов и выполняю его через несколько минут, подсчет увеличивается. Моя база данных работает на удаленном ПК. почему это показало мне ошибку? Как я могу узнать, что происходит? – Gondil

Смежные вопросы