기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 쿼리 엔진은 서술문과 다른 순서로 문을 평가할 수 있습니다. 예를 들어 다음 순서로 평가할 수도 있습니다.
John
라는 모든 사람을 검색합니다.:likes
엣지 기준으로John
에 연결된 모든 사람을 검색합니다.이 집합을
Jane
이라는 사람들로 필터링합니다.이 집합을
: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 . }
이 경우 각 단계에서 다음 단일 작업으로 쿼리를 줄일 수 있습니다.
:name
Jane
을 사용하여 단일 사람 노드를 검색합니다.:name
John
을 사용하여 단일 사람 노드를 검색합니다.:likes
엣지를 사용하여 첫 번째 노드가 두 번째 노드에 연결되어 있는지 점검합니다.:likes
엣지를 사용하여 두 번째 노드가 첫 번째 노드에 연결되어 있는지 점검합니다.
중요
잘못된 순서를 선택하면 joinOrder
쿼리 힌트로 인해 성능이 크게 떨어질 수 있습니다. 예를 들어 앞의 예는 :name
속성이 고유하지 않은 경우 비효율적입니다. 100개의 모든 노드가 Jane
으로 명명되고 1,000개의 모든 노드가 John
으로 명명된 경우 쿼리는 결국 :likes
엣지에 대해 1,000 * 100(100,000) 페어를 검사하게 됩니다.