joinOrder SPARQL 쿼리 힌트 - Amazon Neptune

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

joinOrder SPARQL 쿼리 힌트

SPARQL 쿼리를 제출하면 Amazon Neptune 쿼리 엔진이 쿼리의 구조를 조사합니다. 쿼리의 일부를 재정렬하고 평가 및 쿼리 응답 시간에 필요한 작업량을 최소화하려고 시도합니다.

예를 들어, 연결된 트리플 패턴의 시퀀스는 일반적으로 지정된 순서로 평가되지 않습니다. 개별 패턴의 선택성 및 공유 변수를 통한 연결 방법과 같은 휴리스틱 및 통계를 사용하여 재정렬됩니다. 또한 쿼리에 하위 쿼리, FILTERs 또는 복잡한 OPTIONAL 또는 MINUS 블록과 같은 더 복잡한 패턴이 포함된 경우 Neptune 쿼리 엔진은 효율적인 평가 순서를 목표로 가능한 경우 쿼리를 재정렬합니다.

보다 복잡한 쿼리의 경우 Neptune이 쿼리를 평가하도록 선택하는 순서가 항상 최적이 아닐 수도 있습니다. 예를 들어, Neptune은 쿼리 평가 중에 나타나는 인스턴스 데이터 관련 특성(예: 그래프의 히팅 파워 노드 등)을 간과할 수 있습니다.

데이터의 정확한 특성을 알고 있고 쿼리 실행 순서를 수동으로 지정하려는 경우 Neptune joinOrder 쿼리 힌트를 사용하여 쿼리가 주어진 순서대로 평가되도록 지정합니다.

joinOrder SPARQL 힌트 구문

joinOrder 쿼리 힌트는 SPARQL 쿼리에 포함된 트리플 패턴으로 지정됩니다.

명료함을 위해 다음 구문에서는 쿼리에 정의되고 포함된 hint 접두사를 사용하여 Neptune 쿼리 힌트 네임스페이스를 지정합니다.

PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> scope hint:joinOrder "Ordered" .
사용 가능한 범위
  • hint:Query

  • hint:Group

쿼리 힌트 범위에 대한 자세한 내용은 Neptune의 SPARQL 쿼리 힌트 범위 단원을 참조하십시오.

joinOrder SPARQL 힌트 예제

이 단원에서는 joinOrder 쿼리 힌트 및 관련 최적화를 사용하거나 사용하지 않고 작성된 쿼리를 보여줍니다.

이 예제의 경우 데이터 세트에 다음 내용이 포함되어 있다고 가정합니다.

  • John이라는 한 사람이 Jane을 포함하여 :likes 1,000명을 포함합니다.

  • Jane이라는 한 사람이 John을 포함하여 :likes 10명을 포함합니다.

쿼리 힌트 없음

다음 SPARQL 쿼리는 소셜 네트워킹 데이터 세트에서 이름이 John 이고 서로 Jane 좋아하는 모든 사람 페어를 추출합니다.

PREFIX : <https://example.com/> SELECT ?john ?jane { ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

Neptune 쿼리 엔진은 서술문과 다른 순서로 문을 평가할 수 있습니다. 예를 들어 다음 순서로 평가할 수도 있습니다.

  1. John라는 모든 사람을 검색합니다.

  2. :likes 엣지 기준으로 John에 연결된 모든 사람을 검색합니다.

  3. 이 집합을 Jane이라는 사람들로 필터링합니다.

  4. 이 집합을 :likes 엣지 기준으로 John에 연결된 사람으로 필터링합니다.

데이터 세트에 따라 이 순서로 평가하면 1,000개의 개체가 두 번째 단계에서 추출됩니다. 세 번째 단계는 이를 단일 노드 Jane로 좁힙니다. 마지막 단계는 Jane 또한 :likes John 노드를 결정합니다.

쿼리 힌트

그녀는 단 10개의 발신 :likes 엣지만 있기 때문에 Jane 노드로 시작하는 것이 유리할 것입니다. 이렇게 하면 두 번째 단계에서 1,000개의 개체를 추출하지 않아도 쿼리를 평가하는 동안 작업량이 줄어듭니다.

다음 예제에서는 joinOrder 쿼리 힌트를 사용하여 쿼리에 대한 모든 자동 조인 재정렬을 비활성화하여 Jane 노드와 발신 엣지가 먼저 처리되도록 합니다.

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person1 :likes ?person2 . ?person2 :name "John" . ?person2 :likes ?person1 . }

적용 가능한 실제 시나리오는 네트워크에 연결된 사람들이 연결이 많은 인플루언서 또는 연결이 적은 일반 사용자로 분류되는 소셜 네트워크 애플리케이션일 수 있습니다. 이러한 시나리오에서는 이전 예제와 같은 쿼리에서 일반 사용자(Jane)가 인플루언서(John)보다 먼저 처리되도록 할 수 있습니다.

쿼리 힌트 및 재정렬

이 예제를 한 단계 더 나갈 수 있습니다. :name속성이 단일 노드에 대해 고유하다는 것을 알고 있다면 joinOrder 쿼리 힌트를 재정렬하고 사용하여 쿼리의 속도를 높일 수 있습니다. 이 단계에서는 고유한 노드가 먼저 추출되도록 합니다.

PREFIX : <https://example.com/> PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#> SELECT ?john ?jane { hint:Query hint:joinOrder "Ordered" . ?person1 :name "Jane" . ?person2 :name "John" . ?person1 :likes ?person2 . ?person2 :likes ?person1 . }

이 경우 각 단계에서 다음 단일 작업으로 쿼리를 줄일 수 있습니다.

  1. :name Jane을 사용하여 단일 사람 노드를 검색합니다.

  2. :name John을 사용하여 단일 사람 노드를 검색합니다.

  3. :likes 엣지를 사용하여 첫 번째 노드가 두 번째 노드에 연결되어 있는지 점검합니다.

  4. :likes 엣지를 사용하여 두 번째 노드가 첫 번째 노드에 연결되어 있는지 점검합니다.

중요

잘못된 순서를 선택하면 joinOrder 쿼리 힌트로 인해 성능이 크게 떨어질 수 있습니다. 예를 들어 앞의 예는 :name 속성이 고유하지 않은 경우 비효율적입니다. 100개의 모든 노드가 Jane으로 명명되고 1,000개의 모든 노드가 John으로 명명된 경우 쿼리는 결국 :likes 엣지에 대해 1,000 * 100(100,000) 페어를 검사하게 됩니다.