2017-11-13 5 views
0

다른 소스 시스템의 임시 데이터 세트를 포함하기 위해 neo4j를 사용하고 있습니다. 내 데이터는 ~ 4 ~ 7 개의 다양한 유형의 하위 오브젝트 계층을 포함하는 몇 개의 상위 오브젝트로 구성됩니다. 데이터 세트당 총 개체 수는 2,000 ~ 150 만 개입니다. 필자는 파이썬 py2neo 라이브러리를 사용하고 있습니다.이 라이브러리는 데이터 생성 단계에서 좋은 성능을 보였고보고를 위해 사이퍼 쿼리를 통과했습니다.neo4j에서 관련없는 데이터 세트를 분리하는 최적의 방법은 무엇입니까?

쿼리 및 퍼지 목적으로 관련없는 시스템에서 데이터 세트를 분리하고 싶지만 성능이 걱정됩니다. 몇 가지 아이디어가 있지만 나에게 실행 가능성이 가장 높은 것은 분명하지 않습니다.

  1. 가장 쉽게 구현할 수있는 코드는 최상위 "프로젝트"객체입니다. 그 프로젝트 객체는 몇 개의 직접적인 자식 (관계를 통해)과 많은 간접적 인 자식을 가질 것이다. 나는 프로젝트별로 필터링하고 싶을 때 관계 와일드 카드 MATCH (pr:project)<-[:IN_PROJECT*7]-(c:child_object) 거리를 사용해야 할 것인데, 그것은 매우 비싼 쿼리와 비슷하게 보입니다.

  2. 또한 프로젝트 개체와 프로젝트의 다른 모든 개체 사이에 직접적인 관계를 만들 수 있습니다. MATCH (pr:project)<-[:IN_PROJECT]-(c:child_object) 이것은 쿼리 작성이 쉬워야하지만 잠재적으로 수백만 개의 관계가있는 단일 개체가있을 때 어떤 일이 발생할지 모릅니다.

  3. 마지막으로 데이터 세트의 모든 단일 개체에 project-id 속성을 설정할 수있었습니다. MATCH (c:child_object {project-id:"A1B2C3"}) 그것은 낭비적인 해결책 인 것처럼 보이지만 그래프 DB 모델에서 성능이 현명 할 수도 있습니다.

샘플 Cypher 쿼리/neo4j 용어를 잘못 작성한 경우 사과드립니다. 나는 6 주 동안이 프로젝트를 제쳐두고 조금 녹슬었다.

+0

재미있게도 [OCIM3] (http://www.opencypher.org/event/2017/11/13/ocim3/) 오픈 오피스는 이미 프랑스에서 개최되었습니다. 이벤트의 주요 주제는 "Multiple Graphs"를 처리하는 것이 었습니다.이 방법은이 문제를 해결할 수있는 좋은 방법입니다. 그때까지는 해결 방법이 남아 있습니다. 내가 선호하는 방법을 1 분 안에 추가하겠습니다. –

답변

1

데이터 세트가 유한 한 경우 전용 레이블을 사용하여 데이터 원본을 지정하는 것이 좋습니다. Neo4j의 특성 그래프 데이터 모델에서 노드는 multiple labels이 허용됩니다.

MATCH (c:child_object:DataSourceA) 

레이블은 항상 색인이 생성되어 있으므로 성능은 제안서 1-3보다 우수해야합니다. 또한이 방법이 좀 더 세련된 해결책이라고 생각합니다. 그러나 데이터 수를 알지 못한다면 문제가 발생할 것입니다. 후자의 경우, 당신은

MATCH (c:child_object) 
WHERE 'DataSourceA' IN labels(c) 

같은 것을 사용할 수 있습니다하지만 성능 현명한, 당신은 당신의 접근 방식 3을 사용하고 project-id에 인덱스를 구축 더 나을 것, 그래서 이것은 더 "전체 테이블 스캔"처럼 .

+0

그건 재미 있어요. 내가 처음 neo4j를 배웠을 때 관련 유스 케이스가 없었기 때문에 여러 라벨이 허용된다는 것을 잊었습니다. 런타임에 이러한 알려지지 않은 레이블을 발견하는 것이 얼마나 번거로운지를 알아야 할 것입니다. 아마 그 (것)들을 확인할 수있을 것이다 그래야 그 (것)들에게 모두 동일한 접두사를주십시오? 얼마나 친절한 py2neo가 multi-label과 함께 있을지 알아야합니다. – scottwed

+0

우물 레이블은 쉽게 발견 할 수 있습니다. 검색어 'MATCH (n) UNWIND labels (n) AS label RETURN DISTINCT label'이 트릭을해야합니다. –

+0

몇 가지 실험을 한 후에 속성 메서드 (# 3)를 사용하려고합니다.내 관계를 필터링해야한다는 것을 깨달았고 neo의 기본 웹 인터페이스에서 임의의 쿼리를 수행 할 때 반환 된 모든 객체 및 관계에 대한 속성을 확인하면 내 코드의 문제를 좀 더 쉽게 해결할 수 있습니다. – scottwed