2012-12-11 5 views
4

테이블에서 23 억 개의 관계를 가져오고 있습니다. 가져 오기가 시간당 5 백만의 속도를 얻는 속도가 매우 빠르며 마이그레이션을 완료하는 데 20 일이 소요됩니다. neo4j 배치 삽입 및 batch insert utility에 대해 들어 보았습니다. 이 유틸리티는 CSV 파일에서 가져 오기를 통해 흥미로운 작업을 수행하지만 최신 코드는 깨지기 쉽고 실행되지 않는 코드입니다.Neo4j로 일괄 삽입

나는 neo4j에서 약 100M 관계가 있으며 중복 관계가 없는지 확인해야합니다.

: 나는 또한 다음을 읽고
begin transaction 
for 50K relationships 
create or get user node for user A 
create or get user node for user B 
check there is relationship KNOW between A to B if not create the relationhsip 
end transaction 

처럼 내가

현재 코드에 의해 neo4j에 일을 빨리 어떻게

입니다

+0

현재 가져 오기를 수행하는 방법에 대한 자세한 내용은 도움이 될 것입니다. . 배치 서비스는 본질적으로 단일 HTTP 요청으로 서버에 여러 명령을 전송하여 HTTP 오버 헤드를 줄이는 방법입니다. –

+0

db에서 데이터를 읽고 임베디드 neo4j에서 가져옵니다. – mtariq

+0

깨진 내용에 대해 자세히 알고 있습니까? 우리는 그것을 고쳐주고 싶습니다. –

답변

0

"사용자 A의 사용자 노드를 얻으십시오", 색인에서 조회합니까? 색인 조회는 일괄 처리 삽입을 실제로 느리게 만듭니다. 인덱스의 "앞에"있는 간단한 HashMap에서 가능한 한 사용자의 큰 부분을 캐쉬하려고하거나 BatchInserterIndex # setCacheCapacity

+0

인덱스에서 예 조회, 그렇지 않다면 배치 삽입을 어떻게 사용합니까? – mtariq

+0

http://docs.neo4j.org/chunked/milestone/batchinsert.html 및 http://github.com/jexp/batch-import의 구현 예 –

3

을 사용하십시오. 충분한 저장 공간이 있다고 가정 할 경우, 가져 오기 단계에서 고유 한 관계를 만드십시오 - 지금은 실제로도 ~ 3mil 레코드가있는 SQL 테이블을 가져 오지만 항상 관계를 만들고 중복 여부에 상관하지 않습니다.

나중에 후 가져 오기는 단순히 이런 독특한 관계 craete하는 사이퍼 쿼리를 수행 할 수 있습니다

START n=node(*) MATCH n-[:KNOW]-m 
CREATE UNIQUE n-[:KNOW2]-m; 

START r=rel(*) where type(r)='KNOW' delete r; 

적어도이 내 지금 접근하고 나중에 사이퍼를 실행입니다 쿼리에는 약 분이 소요됩니다. 사이퍼 쿼리가 메모리 오류에 빠질 수도있는 노드의 빌리 온이있을 때 문제가 발생할 수 있습니다 (neo4j 엔진에 대해 설정 한 캐시 크기에 따라 다름)