2016-04-03 4 views
0

Я пытаюсь импортировать данные из базы данных MySQL в Neo4j, используя CSV-файлы в качестве посредника. Я следую за basic example, но не могу заставить его работать. Я импортирую две таблицы с этими запросами:Импорт CSV-отношений в Neo4j

//Import projects. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/projects.csv" AS row 
CREATE (:project 
{ 
    project_id: row.fan, 
    project_name: row.project_name 
}); 

//Import people. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/persons.csv" AS row 
CREATE (:person 
{ 
    person_id: row.person_id, 
    person_name: row.person_name, 
}); 

//Create indicies. 
CREATE INDEX ON :project(project_id); 
CREATE INDEX ON :project(project_name); 
CREATE INDEX ON :person(person_id); 
CREATE INDEX ON :person(person_name); 

Эта часть работает. Что не работает, когда я пытаюсь импортировать отношения:

//Create project-person relationships. 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
MATCH (project:project {project_id: row.project_id}) 
MATCH (person:person {person_id: row.person_id}) 
MERGE (person)-[:CONTRIBUTED]->(project); 

Консоль принимает запрос без ошибки, но никогда не заканчивается. Он работает в течение нескольких дней с 100% процессором, 25% оперативной памяти, но незначительным использованием диска. В базе данных нет отношений.

Я сделал ошибку где-то, или это действительно так медленно? Файл project_persons.csv имеет длину 13 миллионов строк, но не должен ли периодический коммит делать что-то, что появляется?

ответ

0
shouldn't the periodic commit make something show up by now? 

Только для НАГРУЗКИ - сделать «объяснить» в передней части CREATE и расскажу вам, как это структурирование обновление и # записей, которые предполагается обрабатывать. Я столкнулся с той же проблемой - Neo4j выполнял все обновление как одну транзакцию и никогда не завершался. Транзакция должна была быть разбита на 50K - 100K tx chunks, чтобы все было сделано.

Один из способов сделать это - импортировать информацию о соотношении как набор помеченных узлов, а затем использовать эти узлы для MATCH() человека и узлов проекта и создать отношение по мере необходимости.

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/project_persons.csv" AS row 
CREATE (:Relations {project_id: row.project_id, person_id: row.person_id}) 

затем обработать записи в 50K партий:

MATCH (r:Relations) 
MATCH (prj:project {project_id: r.project_id}) 
MATCH (per:person {person_id: r.person_id}) 
WITH r, prj, per LIMIT 50000 
MERGE (per)-[:CONTRIBUTED]->(prj) 
DELETE r 

Выполнить это несколько раз, пока все отношения не будут созданы, и вы хорошо идти.

+0

Это работает, но импорт всех данных является утомительным, даже когда я увеличил лимит. И по какой-то причине у меня осталось 200k отношений, которые не будут сливаться или удаляться. – Rachie

+0

Согласен, быть утомительным. Что вы делаете, чтобы удалить нежелательные отношения? –

+0

Я не знаю, что с ними делать, или даже если они нежелательны. – Rachie

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