2016-07-13 3 views
0

Я пытаюсь оценить Neo4j (используя версию сообщества).
Я импортирую некоторые данные (1 миллион строк), используя процесс LOAD CSV. Он должен соответствовать ранее импортированным узлам, чтобы создать связь между ними.Neo4j CSV импорт очень медленный, при настройке отношений

Вот мой запрос:

//Query #3 
//create edges between Tr and Ad nodes 

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///1M.txt' 
AS line 
FIELDTERMINATOR '\t' 

//find appropriate tx and ad 
MATCH (tx:Tr { txid: TOINT(line.txid) }), (ad:Ad {p58: line.p58}) 

//create the edge (relationship) 
CREATE (tx)-[out:OUT_TO]->(ad) 

//set properties on the edge 
SET out.id= TOINT(line.id) 
SET out.n = TOINT(line.n) 
SET out.v = TOINT(line.v) 

У меня есть indicies на:

Indexes 
    ON :Ad(p58)  ONLINE (for uniqueness constraint) 
    ON :Tr(txid)  ONLINE        
    ON :Tr(h)   ONLINE (for uniqueness constraint) 

Этот запрос был запущен в течение 5 дней, и теперь он до сих пор создано 270K отношения (из 1M) ,
Java кучи 4g
Машина имеет 32G оперативной памяти и SSD на диске, только в операционной системе Linux и Neo4j

Любые намеки на ускорить этот процесс, будет высоко ценится.
Должен ли я попробовать корпоративное издание?

Запрос План:

+--------------------------------------------+ 
| No data returned, and nothing was changed. | 
+--------------------------------------------+ 
If a part of a query contains multiple disconnected patterns, 
this will build a cartesian product between all those parts. 
This may produce a large amount of data and slow down query processing. 
While occasionally intended, 
it may often be possible to reformulate the query that avoids the use of this cross product, 
perhaps by adding a relationship between the different parts or by using OPTIONAL MATCH (identifier is: (ad)) 
20 ms 

Compiler CYPHER 3.0 

Planner COST 

Runtime INTERPRETED 

+---------------------------------+----------------+---------------------+----------------------------+ 
| Operator      | Estimated Rows | Variables   | Other      | 
+---------------------------------+----------------+---------------------+----------------------------+ 
| +ProduceResults     |    1 |      |       | 
| |        +----------------+---------------------+----------------------------+ 
| +EmptyResult     |    |      |       | 
| |        +----------------+---------------------+----------------------------+ 
| +Apply       |    1 | line -- ad, out, tx |       | 
| |\        +----------------+---------------------+----------------------------+ 
| | +SetRelationshipProperty(4) |    1 | ad, out, tx   |       | 
| | |        +----------------+---------------------+----------------------------+ 
| | +CreateRelationship   |    1 | out -- ad, tx  |       | 
| | |        +----------------+---------------------+----------------------------+ 
| | +ValueHashJoin    |    1 | ad -- tx   | ad.p58; line.p58   | 
| | |\       +----------------+---------------------+----------------------------+ 
| | | +NodeIndexSeek    |    1 | tx     | :Tr(txid)     | 
| | |        +----------------+---------------------+----------------------------+ 
| | +NodeUniqueIndexSeek(Locking) |    1 | ad     | :Ad(p58)     | 
| |        +----------------+---------------------+----------------------------+ 
| +LoadCSV      |    1 | line    |       | 
+---------------------------------+----------------+---------------------+----------------------------+ 
+0

Можете ли вы добавить план запроса (результаты добавления 'EXPLAIN' в начало вашего запроса)? –

ответ

1

ХОРОШО, поэтому разделив заявление MATCH на два он ускорил запрос очень. Спасибо @William Lyon за указание на план. Я заметил предупреждение.

старый MATCH обьявления

MATCH (tx:Tr { txid: TOINT(line.txid) }), (ad:Ad {p58: line.p58}) 

разделилась на две части:

MATCH (tx:Tr { txid: TOINT(line.txid) }) 
MATCH (ad:Ad {p58: line.p58}) 

на 750K отношениях запрос занял 83 секунд.
Следующий 9 млн. CSV LOAD

+0

9M строк заняло 30 минут, 20M строк заняло 70 минут –

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