2014-02-21 5 views
1

상황은 다음과 같습니다. 고유하고 인덱싱 된 것으로 설정된 ContactId 속성이있는 노드가 있습니다. 노드 레이블은 다음과 같습니다 (: 연락처 {ContactID가 1} 노드) : Neo4j 2.0 고유 제약 조건 성능 병합으로 병합 하시겠습니까?

내가 주소에 대한 그 패턴과 유사한 다른 노드가 (노드 2 : 주소 {AddressId : 1})

지금 시도 에 문의 (참조를 위해 ContactId를 포함하는) 새 노드를 추가하려면 (노드 3 : ContactAddress {AddressId : 1, ContactId : 1})

각 노드에 대해 병합 명령을 실행할 때 추가 할 시간 다른 노드 유형에서 고유 한 것으로 설정된 등록 정보를 포함하는 노드는 프로세스를 훨씬 느리게 만듭니다.

ContactAddress 노드는 연락처 노드와 주소 노드 사이의 관계형 속성 만 포함합니다. 연락처 및 주소 노드는 각각 최대 10 개의 속성을 포함합니다. 이것은 Neo4j가 속성 키 -> 값 -> 노드 레이블을 확인하는 버그입니까? 아래

코드 및 스크린 샷 :

string strForEach = string.Format("(n in {{{0}}} | 
MERGE (c:{1} {{{2} : n.{2}}}) SET c = n)", propKey, label, PK_Field); 

var query = client 
      .Cypher 
      .ForEach(strForEach) 
      .WithParam(propKey, entities.ToList()); 

Process timings

답변

0

제약 조건 검사가 단지 삽입보다 더 비싸다. 또한 다중 삽입을 방지하기 위해 제약 조건에 대한 전역 잠금을 사용합니다.

매개 변수는 사용하지 않지만 문자열 대체는 이고 실제로는으로 변경하고 매개 변수를 사용하는 것이 좋습니다.

또한 전체 노드 c를 n으로 설정하면 제약 조건 검사가 다시 트리거됩니다.

당신의 아마 MERGE

(n in {nodes} | 
MERGE (c:Label {key : n.key}}) ON CREATE SET c.foo = n.foo, c.bar = n.bar) 
+0

감사 마이클의 ON CREATE SET 절을 사용하고 싶습니다. 내가 사용하고있는 매개 변수는 항목 목록입니다. 레이블과 고유 키에 params를 추가 할 수 있습니다. On Create 기능을 사용하면 작업 속도가 빨라 집니까? 이 예에서 전체 병합 지점은 새 목록에 따라 값을 항상 업데이트하려고합니다. 따라서 create와 on match에서'set c = n'을 사용하십시오. 다른 문제는 목록이 동적이기 때문에 예제 에서처럼 속성을 설정하는 것이 다소 번거롭기는하지만 성능에 도움이된다고 생각하면 시도해 볼 수 있습니다. 이것에 대해 이야기하는 곳이면 어디서나 문서를 알고 있습니까? – dcinzona

+0

또한 병합은 첫 번째 두 노드 유형 (연락처 및 주소)에서도 발생하지만 약 1/2 초 (여전히 짜증이납니다)로 삽입되지만 '연락처 주소' 인덱싱 된 ContactId 및 AddressId 키가 모두 포함 된 노드 삽입은 상당히 오래 걸립니다. – dcinzona

+0

params 코멘트와 관련하여 또 다른 빠른 질문입니다. 어떻게 라벨을 두 번째로 조회하는 것이 더 빠를 수 있습니까? 즉, {{labelName} -> Params를 올바른 값으로 검색 -> 두 번째 매개 변수 목록의 조회 값이 첫 번째 매개 변수 구문 분석 단계 전체를 건너 뛰는 것보다 빠를 수 있습니다. 내 머리 속에는 2 개의 조회가 하나보다 빠를 수는 없지만, 다시 말해서 Neo4j에 정말 새로워졌습니다. params lookup이 정적으로 문자열을 설정하는 것보다 빠르다면, 그 변경을 할 것입니다. 나는 그것이 어떻게 될지 보지 못한다. – dcinzona

관련 문제