2016-12-12 10 views
1

Neo4j에 약 1 백만 개의 노드를 삽입해야합니다. 각 노드가 고유하다는 것을 지정해야하므로 노드를 삽입 할 때마다 동일한 노드가 아직 있는지 확인해야합니다. 또한 관계는 고유해야합니다. 내가 파이썬과 사이퍼를 사용하고많은 수의 노드를 Neo4J에 삽입하는 방법

:

uq = 'CREATE CONSTRAINT ON (a:ipNode8) ASSERT a.ip IS UNIQUE' 
... 
queryProbe = 'MERGE (a:ipNode8 {ip:"' + prev + '"})' 
... 
queryUpdateRelationship= 'MATCH (a:ipNode8 {ip:"' + prev + '"}),(b:ipNode8 {ip:"' + next + '"}) MERGE (a)-[:precede]->(b)' 

문제는 Neo4j에 40-50K 노드를 가하고 후, 삽입 속도를 빠르게 속도가 느려집니다 내가 무엇을 넣을 수 없다는 것입니다.

답변

0

이와 같은 대량 삽입의 경우 정기 커밋 또는 import tool과 함께 LOAD CSV을 사용하는 것이 가장 좋습니다.

문자열에 값을 추가하는 대신 매개 변수가있는 쿼리를 사용하는 것이 가장 좋습니다.

또한 ipNode8에 대한 고유 한 속성 제약 조건을 만들었지 만, 당신이 머지 않아 처음으로 ipNode가 아닙니다. 당신도 그것에 대한 유일한 제약이 필요해 보입니다.

+0

항상 ipNode8을 사용합니다. 복사하여 오류가있었습니다. – RamsesXVII

1

질문이 열려 있습니다. @ InverseFalcon의 권장 사항 외에도 조사 속도를 높이기 위해 조사 할 수있는 몇 가지 사항이 있습니다.

  1. 성능 튜닝 설명서를 읽고 권장 사항을 따르십시오. 특히 메모리 관련 문제가 발생할 수 있으므로 Memory Tuning 섹션이 매우 유용 할 수 있습니다.

  2. Cypher 쿼리가 빨라질 수 있습니다. 예를 들어 이해가된다면 다음과 같이해볼 수 있습니다. dataparameter{a: 123, b: 234} 형식의 개체 목록으로 예상됩니다. 단일 트랜잭션 내에서 목록을 처리하는 동안 서버의 메모리가 부족하지 않도록 목록을 적절하게 만들 수 있습니다 (예 : 20K). (이 쿼리는 또한 존재하지 않는 경우 b을 만들 것으로 가정합니다.) 당신이 사용할 수 있습니다 periodic execution APOC 절차도 있습니다

    UNWIND {data} AS d 
    MERGE (a:ipNode8 {ip: d.a}) 
    MERGE (b:ipNode8 {ip: d.b}) 
    MERGE (a)-[:precede]->(b) 
    

    .