2016-07-13 6 views
0

Neo4j (커뮤니티 버전 사용)를 평가하려고합니다.
LOAD CSV 프로세스를 사용하여 일부 데이터 (1 백만 행)를 가져옵니다. 이전에 가져온 노드와 일치 시켜서 관계를 생성해야합니다.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) 

나에 대한 모든 인덱스이 :이 쿼리는 이제 5 일간 실행 된

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

를하고 지금까지 (1M에서) 270K 관계를 만든 다음

내 쿼리입니다 .
Java 힙이
기계 4g의된다 높게 평가 될 것이다이 과정의 최대 속도를 어떤 힌트는 RAM의 32G 만 실행 리눅스 드라이브를위한 SSD 및 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

OKAY, 그래서 두 가지로 MATCH 문을 분할하여 그것은 대단히 쿼리를주었습니다. 저를 Plan으로 안내해 주신 Mr.William Lyon에게 감사드립니다. 나는 경고를 알아 차렸다. 두에

된 매치 atatement

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

분할 : 750K 관계에

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

쿼리 83 초 걸렸습니다.
다음 9 백만 CSV LOAD

+0

9M 행 30 분 걸렸습니다 20M 행 70 분 걸렸습니다. –