Я новичок в 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)"
^
Можно ли создать отношения таким образом, между большим количеством существующих узлов , или мне нужно использовать другой подход?
Возможно, вы можете использовать более высокие лимиты в зависимости от имеющейся памяти. –
Это помогает, спасибо. BTW вам нужно только изменить SKIP и сохранить LIMIT постоянным. – Alex
да действительно предел может быть постоянным –