2015-03-11 4 views
0

есть набор данных в CSV-файл с форматомNeo4j нескончаемого медленный узла создания

"title"|year|"word" 
"Into the Wild"|2007|"abandoned-bus" 
"Into the Wild"|2007|"adolescence" 
"Into the Wild"|2007|"adoption" 

Этого файл имеет более чем уЮ линию.

У меня есть база данных, работающая на удаленном суперкомпьютере, который я подключаю с помощью туннеля ssh. Я создаю 2 индекса:

CREATE INDEX ON :MOVIE(title) 
CREATE INDEX ON :KEYWORD(word) 

Тогда я выполнить запрос:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:c:/Users/.../Data/rels.csv" AS csv 
FIELDTERMINATOR '|' 
MERGE (m:MOVIE {title:csv.title }) 
ON CREATE SET m.year = toInt(csv.year) 
MERGE (k:KEYWORD {word:csv.word}) 

Через некоторое время, я не знаю, один час, информация о запросе выполнения исчезает или появляется неизвестная ошибка. Но когда я перехожу к localhost: 7474/webadmin в статистике, количество узлов увеличивается очень медленно - 5-8 узлов за 10 секунд.

Когда я выполнить запрос: (я могу, потому что нет хода запроса показан)

match (m) 
return count(m) 

есть около 79K узлов. Но счет увеличивается более 21 часа. И мне нужно создать около 1.2M узлов, а сделать примерно 4M отношений между ними. Когда я делаю базовые вычисления, создание узлов 1.2M будет продолжаться около 13 дней. И действительно не хочу знать, как долго будет длиться создание отношений 4M.

Что происходит? Как закрепить его? Что я могу сделать? Пожалуйста, помогите.

Примечание:

Я уже создал узлы видеосюжетов и ключевых слов в прошлом, и сделал это из отдельных CSV файлов, содержащих только видеосъемку или ключевые слова и сделал это без использования PERIODIC COMMIT, но выбраны вручную около 60K строк и казнены запрос на него. Но я удалил их все, чтобы сделать это в 2 запросах также с отношениями и без работы с делением файлов csv. Не могу представить, чтобы вручную делить файл 4M строк на 60K строк файлов.

+0

Возможно, вы можете настроить периодическую фиксацию на 1000, а также поделиться своей конфигурацией neo4j-wrapper, особенно настройками размера кучи java. –

+0

Что еще хуже, у меня нет доступа к ним, потому что эти файлы базы данных находятся на этом удаленный компьютер. Но я помню, что мой наставник задал им большие ценности, потому что этот компьютер должен делать это легко. Но где я могу настроить периодическую фиксацию? И я также думаю, что этот файл обертки не во всех версиях, я имею в виду, что в версии Windows такого файла нет, но в версии Linux он должен быть там. – Gondil

+0

ИСПОЛЬЗОВАНИЕ ПЕРИОДИЧЕСКОЙ КОМИТЕТЫ 1000 LOAD CSV ... – albertoperdomo

ответ

1

Я немного изменил процедуру.

  1. Загрузить все 160K Ключевые слова из ключевых слов CSV, содержащие только ключевые слова (несколько миллисекунд)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../kw.csv' as csv CREATE (:KEYWORD {word:csv.word})

  2. Загрузить все фильмы 2M из фильма CSV, содержащих только названия фильмов и годы (несколько секунд)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../mov.csv' as csv CREATE (:MOVIE {title:csv.title, year: toInt(csv.year)})

  3. Создание индексов на MOVIE и KEYWORD

    CREATE INDEX ON :MOVIE(title) CREATE INDEX ON :MOVIE(year) CREATE INDEX ON :KEYWORD(word)

  4. Загрузка отношение из CSV, содержащие фильмы названия, лет и ключевых слов (это занимает несколько часов, но было довольно быстро, мог видеть прогресс в интерфейсе программы WebAdmin)

    USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM 'file:c:/.../rels.csv' as csv MATCH (m:MOVIE {title:csv.title, year: toInt(csv.year)}) MATCH (k:KEYWORD {word:csv.word}) MERGE (m)-[:HAS {weight:1}]->(k)

Надеюсь, это поможет кому-то в будущем.

+0

Вероятно, вы столкнулись с этой проблемой: http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/ –

+1

измените свой последний запрос на: 'ИСПОЛЬЗОВАНИЕ ПЕРИОДИЧЕСКОГО КОМИТЕТА 1000 LOAD CSV WITH HEADERS FROM 'файл: c: /.../ rels.csv' как csv MATCH (m: MOVIE {title: csv.title}) WHERE m.year = toInt (csv.year) MATCH (k: KEYWORD {word: csv.word}) CREATE (m) - [: HAS {weight: 1}] -> (k) ' –

+0

Теперь все готово, мой последний запрос работает нормально, требуется несколько часов но он работает нормально. Если я могу спросить, какая разница? между моим и вашим? Что ваш запрос во-первых найти фильм с определенным заголовком, используя индекс, и пытается проверить, имеет ли он конкретный год? Я признаю, что это может быть быстрее. Но спасибо, пока мои работы относительно прекрасные тоже :) – Gondil

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