2015-07-20 3 views
1

Я новичок в Neo4J, и я хочу попробовать его на некоторых данных, которые я экспортировал из MySQL. У меня есть версия сообщества, работающая с neo4j console, и я вхожу в команды с помощью клиента командной строки neo4j-shell.Недостаточно памяти при создании большого количества связей

У меня есть 2 CSV-файлы, которые я использую для создания 2 типа узла, а именно:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/updates.csv" AS row 
CREATE (:Update {update_id: row.id, update_type: row.update_type, customer_name: row.customer_name, .... }); 

CREATE INDEX ON :Update(update_id); 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/tmp/facts.csv" AS row 
CREATE (:Fact {update_id: row.update_id, status: row.status, ..... }); 

CREATE INDEX ON :Fact(update_id); 

Это дает мне прибл 650000 узлы обновления и 21000000 факт узлов.

После индексов в Интернете, я пытаюсь создать связи между узлами, следующим образом:

MATCH (a:Update) 
WITH a 
MATCH (b:Fact{update_id:a.update_id}) 
CREATE (b)-[:FROM]->(a) 

Это терпит неудачу с OutOfMemoryError. Я считаю, что это связано с тем, что Neo4J не фиксирует транзакцию до ее завершения, сохраняя ее в памяти.

Что можно сделать, чтобы предотвратить это? Я прочитал о USING PERIODIC COMMIT, но похоже, что это только полезно при чтении CSV, так как она не работает в моем случае:

neo4j-sh (?)$ USING PERIODIC COMMIT 
> MATCH (a:Update) 
> WITH a 
> MATCH (b:Fact{update_id:a.update_id}) 
> CREATE (b)-[:FROM]->(a); 
QueryExecutionKernelException: Invalid input 'M': expected whitespace, comment, an integer or LoadCSVQuery (line 2, column 1 (offset: 22)) 
"MATCH (a:Update)" 
^ 

Можно ли создать отношения таким образом, между большим количеством существующих узлов , или мне нужно использовать другой подход?

ответ

3

Исключение из памяти нормально, поскольку оно будет пытаться зафиксировать все сразу и, поскольку вы не предоставили его, я предполагаю, что настройки java heap установлены как значение по умолчанию (512 м).

Вы можете, однако, пакетный процесс с видом пагинации, только я предпочел бы использовать MERGE, а не создавать в этом случае:

MATCH (a:Update) 
WITH a 
SKIP 0 
LIMIT 50000 
MATCH (b:Fact{update_id:a.update_id}) 
MERGE (b)-[:FROM]->(a) 

Modify SKIP и LIMIT после каждой партии до вашей досягаемости 650K узлов обновления ,

+0

Возможно, вы можете использовать более высокие лимиты в зависимости от имеющейся памяти. –

+0

Это помогает, спасибо. BTW вам нужно только изменить SKIP и сохранить LIMIT постоянным. – Alex

+0

да действительно предел может быть постоянным –

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