2017-09-08 1 views
3

나는 약 10M 노드의 데이터베이스를 가지고있다. 이러한 노드 중 9.9M은 쿼리의 99 %에서 사용되지 않지만 여전히 쿼리의 1 %에 필요한 세부 정보입니다. 밖에있는 쿼리의 99 %에 대해 경로가 whildcard 일 수있는 쿼리가 무엇이든 관계없이 특정 노드를 가로 지르지 않도록 그래프 데이터베이스에 지시하려면 어떻게해야합니까?특정 트래버스 방지하기

3 개의 그래프 데이터베이스에 태그를 추가하는 것에 대해 사과드립니다. 아직 어떤 그래프 db가 우리에게 적합한지를 평가하고 있습니다.

답변

1

Neo4j로 작업 할 때 labels을 사용하여 노드를 세트로 그룹화 할 수 있습니다. 레이블의 예로는 :User, Product, Admin 등이 있습니다. 또한 노드 사이에는 relationships을 입력 할 수 있습니다.

이러한 구조는 쿼리 시간에 데이터베이스에 어떤 노드 레이블/관계 유형을 사용해야 하는지를 알려주는 데 사용할 수 있습니다.

예 :

1 - 특정 노드 라벨 만 노드를 돌려줍니다 (:User) :

MATCH (u:User) 
RETURN u 

2 - 노드가 하나 개 이상의 레이블을 가질 수 있기 때문에 :User 라벨하지 Administrator 라벨 (와 노드를 돌려줍니다)는

MATCH (u:User) 
WHERE NOT u:Administrator 
RETURN u 

3 - :User 및의 패턴과 일치사용자가 이고 사용자가 :Administrator을 포함하지 않는 제품에 이르기까지 유형이 :BUY 인 관계 만 따르십시오. 사용자 및 관련 제품을 반환하십시오.

MATCH (u:User)-[:BUY]->(p:Product) 
WHERE u.id = 10 AND NOT u:Administrator 
RETURN u, p 
+0

감사합니다!Neo4J에서는 (특히 와일드 카드 트래버 설에서) 트래버스를 수행하는 동안 이동하지 않도록 지정하는 여러 가지 기타 노드가있는 경우 다른 쿼리의 속도가 느려집니다. –

1

OrientDB를 사용하면 클래스 계층 구조, 상속 및 다형성 쿼리를 사용할 수 있습니다. 당신은 "Class1"(관련)과 "Class2"(세부 사항) 두 가지 클래스를 가질 수 있습니다. 둘 다 수퍼 클래스를 공유합니다 (예 : "SuperClass").

MATCH 
    {class:Class1, as:p1} -TheEdgeClass-> {class:Class1, as:p2, while:($depth < 10)} 
RETURN $elements 

또는 슈퍼 클래스에

, 당신은 모두 적절하고 세부 사항을 필요로하는 경우 :

MATCH 
    {class:SuperClass, as:p1} -TheEdgeClass-> {class:SuperClass, as:p2, while:($depth < 10)} 
RETURN $elements 

두 번째 쿼리 만 관련 기록을 필요로하는 경우

그런 다음, 서브 클래스에 쿼리를 실행할 수 있습니다 그것은 모두 "Superclass"를 확장하기 때문에 "Class1"과 "Class2"의 두 레코드를 모두 반환한다는 의미입니다.

가장자리 클래스에도 똑같이 적용되므로 가장자리의 클래스 계층 구조를 가질 수 있으며 다형성을 사용하여 통과해야하는 관계를 선택할 수도 있습니다.

물론 다른 전략이 있습니다. 패턴에 WHERE 조건을 추가하고 속성을 기준으로 필터링 할 수 있지만 데이터 지역성의 이점을 잃을 수 있습니다 (다른 클래스의 레코드는 다른 파일에 저장되므로 단일 클래스를 기반으로 쿼리 할 때 더 많은 기회를 가질 수 있습니다. 핫 캐시 및 적은 디스크 액세스).

또한 클래스 계층 구조가 여러 수준 깊이 일 수 있다고 생각하십시오 (실제 클래스 트리)

+0

Luigi! OrientDB에서 traversal (특히 와일드 카드 트래버 설)을 수행하는 동안 이동하지 않도록 지정하는 많은 다른 노드가있는 경우 다른 쿼리의 속도가 느려지 는가 –

+0

일반적으로 단일 쿼리의 성능은 탐색하는 노드/에지 (즉, 순회 깊이가 아닌). 다형성을 사용하면 특정 쿼리와 일반 쿼리 모두에서 성능이 향상됩니다 (속도 저하 없음). –