2016-12-08 3 views
1

그래픽 형식으로 XSD를 유지하려면 Neo4J를 사용하고 있습니다. 그래프의 각 Node는 String의리스트 (배열) 인 속성을 가지고 있습니다. 내 쿼리는이 arraylist를 기반으로합니다.Neo4J 스키마 디자인 쿼리

예 : 그래프의 모든 노드에 알파벳 목록이 속성으로 포함되어 있다고 가정 해 봅시다. 이제 내 쿼리는 arraylist에 'C'가 포함 된 모든 노드를 생성해야합니다.

제 질문은 arroylist 속성에서 모든 알파벳을 모든 노드로 자식 노드로 연결된 개별 노드로 이동해야하는지 여부입니다. 그렇게하면 하위 노드에 'C'값이 포함 된 모든 노드가 생성되도록 쿼리가 변경됩니다.

위의 두 가지 방법 중 어느 것이 더 효율적입니다. arraylist의 속성을 가졌거나 arraylist의 개별 값을 포함하는 별도의 자식 노드를 가짐.

실제 시나리오에서 arraylist는 수천 개의 항목을 포함 할 수 있습니다. 그래서 두 번째 방법을 시도하고 각 arraylist 값에 대해 별도의 노드를 만들면 트리가 크기가 커집니다.

하지만 두 가지 중에서 효율적인 방법론을 알아야합니다.

+0

"알파벳"의 의미를 분명히 할 수 있습니까? 그것은 문자 스트링인가? 또는 한 영문자의 문자입니까? 일러스트레이션이나 자세한 내용이 도움이 될 것입니다. – cybersam

+0

[이 다소 관련 질문] (http://stackoverflow.com/questions/28655313/neo4j-enforcing-schema-with-xsd)이 관심의 대상 일 수 있습니다. – cybersam

+0

그래, 이미 위 링크를 보았습니다. 그러나 아직도 나는 나의 선택을 탐구하고 싶다. – Piyush

답변

0

나는 당신이 사용하고자하는 쿼리에 달려 있다고 말하고 싶습니다.

요소에 의한 조회가 주 사용 사례 ('C'가 포함 된 모든 노드를 찾는 경우) 인 경우 별도의 노드가 더 효율적일 수 있습니다. 그 이유는 쿼리가 'contains'유형의 쿼리가 아니지만 역순으로 먼저 자식 노드 'C'(그리고 빠른 검색을 위해 두드러기에서 인덱스 또는 고유 제한이 사용될 것입니다)에 먼저 일치하는 것입니다. 해당 노드에서 연관된 모든 노드로 관계를 횡단합니다. 추가 필터링이나 속성 검사를 수행하지 않고도 관련 결과를 얻을 수 있습니다.

보유자 노드 및 : 다음과 같은 문자 노드 : 고유 한 '문자'속성을 갖는 문자 노드 및 각 : 보유자 노드에는 다음과 같은 일부 하위 세트와의 관계가 있습니다. 문자 노드.

모든 얻기위한 당신의 검색 쿼리 : 그것 뿐이다

MATCH (:Letter{letter:'c'})<-[:Contains]-(h:Holder) 
RETURN h 

: 홀더 노드가 'C'가 포함처럼 보일 것이다. 찾으려는 것으로 일치하면 노드가 포함 된 다른 모든 노드를 찾습니다.

노드 내의 목록을 사용하는 다른 옵션, 특히 수천 개의 항목 (그리고 수천 개의 노드)을 사용하는 것이 나에게 덜 효과적입니다. 내 지식으로는 인덱싱이 콜렉션의 요소를 다루지 않기 때문에 콜렉션 요소에 의한 빠른 검색을 수행 할 수 없으므로 db는 모든 노드의 콜렉션의 모든 요소를 ​​검사하여 해당 요소가있는 노드를 찾아야합니다. 컬렉션이 증가하고 노드 수가 증가함에 따라 느려집니다.

이 사용의 예 : 홀더 노드가 '문자'컬렉션이는 다음과 같습니다,이 간단한보고 쿼리입니다

MATCH (h:Holder) 
WHERE 'c' in h.letters 
RETURN h 

그리고 다시,하지만 느린 하나가 될 것이다 속도를 높이기 위해 색인이나 다른 수단을 이용할 수 없습니다.

그렇다면 다른 쿼리를 사용하여 최종 결정을 내릴 수도 있습니다.

0

사용법에 따라 neo4j는 작업량을 줄여야하므로 동일한 노드에서 동일한 컬렉션의 모든 문자열을 유지하는 것이 더 빠릅니다.