2013-06-06 3 views
5

py2neo python을 사용하여 cypher 명령을 실행하여 (포함되지 않은) neo4j 데이터베이스에 많은 수의 노드 (~ 500,000 개)를 삽입하려고합니다. 모듈 (py2neo.cypher.execute). 결국 나는 py2neo에 대한 의존성을 제거 할 필요가 있지만, 현재 사이퍼와 neo4j에 대해 더 많이 알기 전까지 사용하고 있습니다.사이퍼를 사용하여 neo4j 데이터베이스에 노드를 삽입하는 가장 효율적인 방법

두 개의 노드 유형 A와 B가 있으며 대다수의 노드는 A 유형입니다. A- [r1] -A와 A- [r2] -B와 같은 두 가지 가능한 관계 r1과 r2가 있습니다. . 유형 A의 각 노드는 0 - 100 r1 관계를 가지며 유형 B의 각 노드는 1 - 5000 r2 관계를 갖습니다.

현재 큰 CREATE 문을 작성하여 노드를 삽입하고 있습니다. 예를 들어 나는 성명서를 가지고있을 수도있다.

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-... 

... 여기에서 또 다른 5000 개의 노드와 관계가 그래프에 선형 체인을 형성 할 수있다. 이것은 정상적으로 작동하지만 꽤 느립니다. 또한이 노드를 사용하여 색인을 생성합니다.

CREATE INDEX ON :A(uid) 

모든 유형 A 노드를 추가 한 후 CREATE 문을 사용하여 유형 B 노드를 다시 추가합니다. 마지막으로,

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...) 
CREATE (m)-[:r2]->(c) 

등의 문을 사용하여 r2 관계를 추가하려고합니다. 여기서 ... 수천 개의 OR 문을 나타낼 수 있습니다. 이것은 초당 약간의 관계를 추가하는 것은 정말 느린 것 같습니다.

이렇게하려면 더 좋은 방법이 있습니까? 나는 여기서 완전히 추적하고 있지 않습니까? 나는 this question을 보았지만 이것은 cypher를 사용하여 효율적으로 노드를로드하는 방법을 설명하지 않습니다. 내가 본 모든 것은 자바를 사용하는 것처럼 보일뿐 실제 키퍼 쿼리를 사용하지 않고도 사용할 수 있습니다.

답변

6

끝까지 인덱스를 만들지 마십시오 (2.0에서). 노드 생성 속도가 느려집니다.

Cypher에서 매개 변수를 사용하고 있습니까?

당신의 사이퍼가 매개 변수를 사용할 때마다 똑같지 않으면, 많은 사이퍼 파싱 시간을 잃어 버리는 것을 상상해보십시오. 그것을 모델링 할 수 있다면 성능이 크게 향상 될 것입니다.

이미 사이퍼 요청에 상당히 많은 양의 청크를 보내고 있지만 일괄 요청 API를 사용하면 한 번에 하나 이상의 REST 요청을 보낼 수 있습니다 (시도해보십시오!).

마지막으로 일회성 가져 오기 일 경우 일괄 처리 도구 사용을 고려해 볼 수 있습니다. 잘못된 하드웨어에서도 몇 분 안에 500K 노드를 태워 버릴 수 있습니다. 그런 다음 데이터베이스 파일을 업그레이드 할 수 있습니다 (아직 2.0 파일을 만들 수 있다고는 생각하지 않지만 곧 그렇지 않을 수도 있습니다.), Cypher를 통해 라벨/색인을 만드십시오.

업데이트 : 마지막에 MATCH 문을 발견했습니다. 이런 식으로해서는 안됩니다. ID 대신 OR을 사용하는 대신 한 번에 하나의 관계를 수행하십시오. 이것은 아마도 많은 도움이 될 것이며 uid에 대한 매개 변수를 사용해야합니다. Cypher 2.0은 인덱스 힌트를 사용하는 경우에도 OR을 사용한 인덱스 조회를 수행 할 수없는 것 같습니다. 어쩌면 나중에 올 것이다.

업데이트 2012 년 12 월 : 2.0에는 Cypher 트랜잭션 끝점이 있으며,이 처리량 향상에 큰 효과가있었습니다.저는 "exec"크기 (100-200 문장)와 트랜잭션 크기 (1000-10000 문장)를 사용하여 초당 20-30k Cypher 문장을 보낼 수있었습니다. 사이퍼 로딩 속도를 높이기 위해 매우 효과적입니다.

+1

두 번째 Wes 주석 : 매개 변수, 더 작은 문, 2.0을 사용하는 경우 cypher에 대한 트랜잭션 http 끝점 사용 고려 : 참조 : http://neo4j.org/develop/cypher 및 가져 오기에 대한 레이블 참조 : http : //www.neo4j.org/develop/import 및 http://jexp.de/blog/2013/05/on-importing-data-in-neo4j-blog-series/ –

+0

조언을 주셔서 감사합니다. 파이썬에서 cypher CREATE 문으로 매개 변수를 사용하는 방법을 알고 있습니까? 매개 변수에 대해 알아 낸 모든 것은 자바 해시 맵에 대해 이야기하는 것입니다. – savagent

+0

py2neo에서는 params라는 사전 매개 변수입니다. http://book.py2neo.org/en/latest/cypher.html HTTP를 통해 원시 JSON을 수행하는 경우 쿼리와 함께 params : {uid : ...}를 JSON 요청에 추가 할 수 있습니다. –

관련 문제