

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

# SPARQL 쿼리 힌트
<a name="sparql-query-hints"></a>

쿼리 힌트를 사용하여 Amazon Neptune에서 특정 SPARQL 쿼리에 대한 최적화 및 평가 전략을 지정할 수 있습니다.

쿼리 힌트는 SPARQL 쿼리에 다음과 같은 부분으로 포함된 추가 트리플 패턴을 사용하여 표현됩니다.

```
scope hint value
```
+ *범위* – 쿼리 또는 전체 쿼리의 특정 그룹과 같이 쿼리 힌트가 적용되는 쿼리의 부분을 결정합니다.
+ *힌트* – 적용할 힌트 유형을 식별합니다.
+ *값* – 고려하는 시스템 측면의 동작을 결정합니다.

쿼리 힌트 및 범위는 Amazon Neptune 네임스페이스 `http://aws.amazon.com/neptune/vocab/v01/QueryHints#`의 미리 정의된 용어로 표시됩니다. 이 단원의 예제는 쿼리에 정의되고 포함되는 `hint` 접두사로 네임스페이스를 포함합니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
```

예를 들어 다음은 `SELECT` 쿼리에 `joinOrder` 힌트를 포함하는 방법을 보여줍니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT ... {
 hint:Query hint:joinOrder "Ordered" .
 ...
}
```

앞의 쿼리는 Neptune 엔진이 *주어진* 순서에서 쿼리의 조인을 평가하고 모든 자동 재정렬을 비활성화하도록 지시합니다.

쿼리 힌트를 사용할 때는 다음 사항을 고려하십시오.
+ 단일 쿼리에 다른 쿼리 힌트를 결합할 수 있습니다. 예를 들어 `bottomUp` 쿼리 힌트를 사용하여 상향식 평가를 위해 하위 쿼리에 주석을 추가하고 `joinOrder` 쿼리 힌트를 사용하여 하위 쿼리 내부에서 조인 순서를 수정할 수 있습니다.
+ 다른 중복되지 않은 범위에서 동일한 쿼리 힌트를 여러 번 사용할 수 있습니다.
+ 쿼리 힌트가 힌트입니다. 쿼리 엔진은 일반적으로 주어진 쿼리 힌트를 고려하기 위한 것이지만 무시할 수도 있습니다.
+ 쿼리 힌트는 보존되는 의미 체계입니다. 쿼리 힌트를 추가해도 쿼리 출력은 변경되지 않습니다. 순서 보장이 제공되지 않는 경우, 즉 ORDER BY를 사용하여 결과 순서를 명시적으로 적용하지 않는 경우의 잠재적인 결과 순서는 예외입니다.

다음 섹션에서는 Neptune의 사용 가능한 쿼리 힌트 및 해당 사용에 대한 추가 정보를 제공합니다.

**Topics**
+ [Neptune의 SPARQL 쿼리 힌트 범위](#sparql-query-hints-scope)
+ [`joinOrder` SPARQL 쿼리 힌트](sparql-query-hints-joinOrder.md)
+ [`evaluationStrategy` SPARQL 쿼리 힌트](sparql-query-hints-evaluationStrategy.md)
+ [`queryTimeout` SPARQL 쿼리 힌트](sparql-query-hints-queryTimeout.md)
+ [`rangeSafe` SPARQL 쿼리 힌트](sparql-query-hints-rangeSafe.md)
+ [`queryId` SPARQL 쿼리 힌트](sparql-query-hints-queryId.md)
+ [`useDFE` SPARQL 쿼리 힌트](sparql-query-hints-useDFE.md)
+ [DESCRIBE와 함께 사용되는 SPARQL 쿼리 힌트](sparql-query-hints-for-describe.md)

## Neptune의 SPARQL 쿼리 힌트 범위
<a name="sparql-query-hints-scope"></a>

다음 표에는 Amazon Neptune의 SPARQL 쿼리 힌트에 대한 사용 가능한 범위, 관련 힌트 및 설명이 나와 있습니다. 이러한 항목의 `hint` 접두사는 힌트에 대한 Neptune 네임스페이스를 나타냅니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
```


| Scope | 지원되는 힌트 | 설명 | 
| --- | --- | --- | 
| hint:Query | [joinOrder](sparql-query-hints-joinOrder.md) | 쿼리 힌트는 전체 쿼리에 적용됩니다. | 
| hint:Query | [queryTimeout](sparql-query-hints-queryTimeout.md) | 전체 쿼리에 제한 시간 값이 적용됩니다. | 
| hint:Query | [rangeSafe](sparql-query-hints-rangeSafe.md) | 전체 쿼리에 대해 유형 승격이 비활성화됩니다. | 
| hint:Query | [queryId](sparql-query-hints-queryId.md) | 전체 쿼리에 쿼리 ID 값이 적용됩니다. | 
| hint:Query | [useDFE](sparql-query-hints-useDFE.md) | 전체 쿼리에 대해 DFE 사용이 활성화 또는 비활성화되었습니다. | 
| hint:Group | [joinOrder](sparql-query-hints-joinOrder.md) | 쿼리 힌트는 지정된 그룹의 최상위 요소에는 적용되지만 중첩 요소(예: 하위 쿼리) 또는 상위 요소에는 적용되지 않습니다. | 
| hint:SubQuery | [evaluationStrategy](sparql-query-hints-evaluationStrategy.md) | 힌트가 지정되어 중첩된 SELECT 하위 쿼리에 적용됩니다. 하위 쿼리는 하위 쿼리보다 먼저 계산된 솔루션을 고려하지 않고 독립적으로 평가됩니다. | 

# `joinOrder` SPARQL 쿼리 힌트
<a name="sparql-query-hints-joinOrder"></a>

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

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

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

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

## `joinOrder` SPARQL 힌트 구문
<a name="sparql-query-hints-joinOrder-syntax"></a>

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

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

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
scope hint:joinOrder "Ordered" .
```

**사용 가능한 범위**
+ `hint:Query`
+ `hint:Group`

쿼리 힌트 범위에 대한 자세한 내용은 [Neptune의 SPARQL 쿼리 힌트 범위](sparql-query-hints.md#sparql-query-hints-scope) 단원을 참조하십시오.

## `joinOrder` SPARQL 힌트 예제
<a name="sparql-query-hints-joinOrder-example"></a>

이 단원에서는 `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`라는 모든 사람을 검색합니다.

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

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

1. 이 집합을 `: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`을 사용하여 단일 사람 노드를 검색합니다.

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

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

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



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

# `evaluationStrategy` SPARQL 쿼리 힌트
<a name="sparql-query-hints-evaluationStrategy"></a>

`evaluationStrategy` 쿼리 힌트는 Amazon Neptune 쿼리 엔진에 주석이 달린 쿼리 조각을 독립적인 단위로 상향식으로 평가해야 함을 알려줍니다. 이는 이전 평가 단계의 솔루션을 사용하여 쿼리 조각을 계산하지 않음을 의미합니다. 쿼리 조각은 독립 단위로 평가되며 생성된 솔루션은 계산 후 나머지 쿼리와 조인됩니다.

`evaluationStrategy` 쿼리 힌트를 사용하는 것은 차단(파이프라인되지 않은) 쿼리 계획을 의미합니다. 즉, 쿼리 힌트가 주석으로 달려 있는 조각의 솔루션이 실체를 갖추고 주 메모리에 버퍼링된다는 뜻입니다. 이 쿼리 힌트를 사용하면 특히 주석 처리된 쿼리 조각이 많은 수의 결과를 계산할 경우 쿼리를 평가하는 데 필요한 주 메모리의 양이 크게 늘어날 수 있습니다.

## `evaluationStrategy` SPARQL 힌트 구문
<a name="sparql-query-hints-evaluationStrategy-syntax"></a>

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

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

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
hint:SubQuery hint:evaluationStrategy "BottomUp" .
```

**사용 가능한 범위**
+ `hint:SubQuery`

**참고**  
이 쿼리 힌트는 중첩된 하위 쿼리에서만 지원됩니다.

쿼리 힌트 범위에 대한 자세한 내용은 [Neptune의 SPARQL 쿼리 힌트 범위](sparql-query-hints.md#sparql-query-hints-scope) 단원을 참조하십시오.

## `evaluationStrategy` SPARQL 힌트 예제
<a name="sparql-query-hints-evaluationStrategy-example"></a>



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

이 예제의 경우 데이터 세트에 다음 특성이 포함되어 있다고 가정합니다.
+ `:connectedTo`이라는 레이블로 지정된 1,000개의 엣지를 포함합니다.
+ 각 `component` 노드는 평균 100개의 다른 `component` 노드에 연결됩니다.
+ 노드 사이의 4홉 주기의 연결 수는 약100입니다.

전형적인 예로 `evaluationStrategy` 힌트는 사이클을 포함하는 쿼리 패턴을 최적화하는 데 도움이 될 수 있습니다.

**쿼리 힌트 없음**  
다음 SPARQL 쿼리는 4개의 홉을 통해 서로 주기적으로 연결된 모든 `component` 노드를 추출합니다.

```
PREFIX : <https://example.com/>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  ?component1 :connectedTo ?component2 .
  ?component2 :connectedTo ?component3 .
  ?component3 :connectedTo ?component4 .
  ?component4 :connectedTo ?component1 .
}
```

Neptune 쿼리 엔진의 접근 방식은 다음 단계를 사용하여 이 쿼리를 평가하는 것입니다.
+ 그래프에서 1,000개의 `connectedTo` 엣지를 모두 추출합니다.
+ 100x(component2에서 발신 `connectedTo` 엣지의 수)로 확장합니다.

  중간 결과: 100,000개 노드
+ 100x(component3에서 발신 `connectedTo` 엣지의 수)로 확장합니다.

  중간 결과: 10,000,000개 노드
+ 주기가 끝날 때까지 10,000,000개의 노드를 스캔합니다.

이 결과 주 메모리가 일정한 스트리밍 쿼리 계획이 생성됩니다.

**쿼리 힌트 및 하위 쿼리**  
계산을 가속화하기 위해 메인 메모리 공간의 균형을 유지하고 싶을 수도 있습니다. `evaluationStrategy` 쿼리 힌트로 쿼리를 다시 작성하여 엔진이 더 작고 구체화된 하위 집합 두 개 사이의 조인을 계산하도록 할 수 있습니다.

```
PREFIX : <https://example.com/>
          PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component1 :connectedTo ?component2 .
      ?component2 :connectedTo ?component3 .
    }
  }
  {
    SELECT * WHERE {
      hint:SubQuery hint:evaluationStrategy "BottomUp" .
      ?component3 :connectedTo ?component4 .
      ?component4 :connectedTo ?component1 .
    }
  }
}
```

다음 트리플 패턴의 결과를 반복적으로 사용하면서 트리플 패턴을 순서대로 평가하는 대신 `evaluationStrategy` 힌트를 사용하면 두 개의 하위 쿼리를 독립적으로 평가할 수 있습니다. 두 하위 쿼리 모두 중간 결과를 위해 100,000개의 노드를 생성한 후에는 최종 결과를 형성하기 위해 함께 조인됩니다.

특히 더 큰 인스턴스 유형에서 Neptune을 실행할 때 이 2개의 100,000개 하위 세트를 주 메모리에 임시로 저장하면 평가 속도가 크게 빨라져 메모리 사용이 늘어납니다.

# `queryTimeout` SPARQL 쿼리 힌트
<a name="sparql-query-hints-queryTimeout"></a>

`queryTimeout` 쿼리 힌트는 DB 파라미터 그룹에 설정된 `neptune_query_timeout` 값보다 작은 제한 시간을 지정합니다.

이 힌트의 결과로 쿼리가 종료되면 `Operation terminated (deadline exceeded)` 메시지와 함께 `TimeLimitExceededException`이 발생합니다.

## `queryTimeout` SPARQL 힌트 구문
<a name="sparql-query-hints-queryTimeout-syntax"></a>

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT ... WHERE {
    hint:Query hint:queryTimeout 10 .
    # OR
    hint:Query hint:queryTimeout "10" .
    # OR
    hint:Query hint:queryTimeout "10"^^xsd:integer .
 ...
}
```

제한 시간 값은 밀리초로 표시됩니다.

제한 시간 값은 DB 파라미터 그룹에 설정된 `neptune_query_timeout` 값보다 작아야 합니다. 그렇지 않으면 `Malformed query: Query hint 'queryTimeout' must be less than neptune_query_timeout DB Parameter Group` 메시지와 함께 `MalformedQueryException` 예외가 발생합니다.

`queryTimeout` 쿼리 힌트는 아래 예제에 표시된 대로 주 쿼리의 `WHERE` 절 또는 하위 쿼리 중 하나의 `WHERE` 절에 지정되어야 합니다.

모든 쿼리/하위 쿼리 및 SPARQL 업데이트 섹션(예: INSERT 및 DELETE)에서 한 번만 설정해야 합니다. 그렇지 않으면 `Malformed query: Query hint 'queryTimeout' must be set only once` 메시지와 함께 `MalformedQueryException` 예외가 발생합니다.

**사용 가능한 범위**

`queryTimeout` 힌트는 SPARQL 쿼리 및 업데이트에 모두 적용할 수 있습니다.
+ SPARQL 쿼리에서는 기본 쿼리 또는 하위 쿼리의 WHERE 절에 나타날 수 있습니다.
+ SPARQL 업데이트에서 INSERT, DELETE 또는 WHERE 절에서 설정할 수 있습니다. 여러 개의 업데이트 절이 있는 경우 그 중 하나에만 설정할 수 있습니다.

쿼리 힌트 범위에 대한 자세한 내용은 [Neptune의 SPARQL 쿼리 힌트 범위](sparql-query-hints.md#sparql-query-hints-scope) 단원을 참조하십시오.

## `queryTimeout` SPARQL 힌트 예제
<a name="sparql-query-hints-queryTimeout-example"></a>

다음은 `UPDATE` 쿼리의 주 `WHERE` 절에서 `hint:queryTimeout`을 사용하는 방법에 대한 예제입니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
INSERT {
    ?s ?p ?o
} WHERE {
    hint:Query hint:queryTimeout 100 .
    ?s ?p ?o .
}
```

여기서 `hint:queryTimeout`은 하위 쿼리의 `WHERE` 절입니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
   ?s ?p ?o .
   {
      SELECT ?s WHERE {
         hint:Query hint:queryTimeout 100 .
         ?s ?p1 ?o1 .
      }
   }
}
```

# `rangeSafe` SPARQL 쿼리 힌트
<a name="sparql-query-hints-rangeSafe"></a>

이 쿼리 힌트를 사용하여 SPARQL 쿼리의 유형 승격을 비활성화할 수 있습니다.

숫자 값 또는 범위에 걸쳐 `FILTER`가 포함된 SPARQL 쿼리를 제출할 때 Neptune 쿼리 엔진은 쿼리 실행 시 일반적으로 유형 승격을 사용해야 합니다. 즉, 필터링 대상 값을 포함할 수 있는 모든 유형의 값을 검사해야 합니다.

예를 들어, 55와 같은 값을 필터링하는 경우 엔진은 55와 같은 정수, 55L의 긴 정수, 55.0과 같은 부동 소수점 등을 검색해야 합니다. 각 유형 승격에는 스토리지에 대한 추가 검색이 필요하므로, 겉보기에 간단한 쿼리를 완료하는 데 예상하지 못하게 시간이 오래 걸릴 수 있습니다.

특정 유형의 값만 찾으면 된다는 사실을 미리 알고 있기 때문에 유형 승격이 불필요한 경우가 많습니다. 이 경우 `rangeSafe` 쿼리 힌트를 사용하여 유형 승격을 끄면 쿼리 속도를 크게 높일 수 있습니다.

## `rangeSafe` SPARQL 힌트 구문
<a name="sparql-query-hints-rangeSafe-syntax"></a>

`rangeSafe` 쿼리 힌트는 `true` 값을 취해 유형 승격을 비활성화합니다. 또한 `false`(기본값) 값도 사용할 수 있습니다.

**예제.** 다음 예제는 1보다 큰 `o` 정수 값을 필터링할 때 유형 승격을 비활성화하는 방법을 보여줍니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * {
   ?s ?p ?o .
   hint:Prior hint:rangeSafe 'true' .
   FILTER (?o > '1'^^<http://www.w3.org/2001/XMLSchema#int>)
```

# `queryId` SPARQL 쿼리 힌트
<a name="sparql-query-hints-queryId"></a>

이 쿼리 힌트를 사용해 SPARQL 쿼리에 자체 queryld 값을 할당합니다.

예제:

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
SELECT * WHERE {
  hint:Query hint:queryId "4d5c4fae-aa30-41cf-9e1f-91e6b7dd6f47"
  {?s ?p ?o}}
```

할당한 값은 Neptune DB의 모든 쿼리에서 고유해야 합니다.

# `useDFE` SPARQL 쿼리 힌트
<a name="sparql-query-hints-useDFE"></a>

이 쿼리 힌트를 사용하면 DFE를 사용하여 쿼리를 실행할 수 있습니다. 기본적으로 Neptune은 이 쿼리 힌트를 `true`로 설정하지 않으면 DFE를 사용하지 않습니다. 이는 [neptune\$1dfe\$1query\$1engine](parameters.md#parameters-instance-parameters-neptune_dfe_query_engine) 인스턴스 파라미터의 기본값이 `viaQueryHint`로 설정되기 때문입니다. 인스턴스 파라미터를 `enabled`로 설정하면 `useDFE` 쿼리 힌트가 `false`로 설정된 쿼리를 제외한 모든 쿼리에 DFE 엔진이 사용됩니다.

쿼리에 DFE를 사용하도록 설정하는 예제:

```
PREFIX : <https://example.com/>
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>

SELECT ?john ?jane
{
  hint:Query hint:useDFE true .
  ?person1 :name "Jane" .
  ?person1 :likes ?person2 .
  ?person2 :name "John" .
  ?person2 :likes ?person1 .
}
```

# DESCRIBE와 함께 사용되는 SPARQL 쿼리 힌트
<a name="sparql-query-hints-for-describe"></a>

SPARQL `DESCRIBE` 쿼리는 리소스 설명을 요청하는 유연한 메커니즘을 제공합니다. 그러나 SPARQL 사양에서는 `DESCRIBE`의 정확한 의미를 정의하지 않습니다.

[엔진 릴리스 1.2.0.2](engine-releases-1.2.0.2.md)부터 Neptune은 다양한 상황에 적합한 여러 `DESCRIBE` 모드와 알고리즘을 지원합니다.

이 샘플 데이터 세트는 다양한 모드를 설명하는 데 도움이 될 수 있습니다.

```
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix : <https://example.com/> .

:JaneDoe :firstName "Jane" .
:JaneDoe :knows :JohnDoe .
:JohnDoe :firstName "John" .
:JaneDoe :knows _:b1 .
_:b1 :knows :RichardRoe .

:RichardRoe :knows :JaneDoe .
:RichardRoe :firstName "Richard" .

_:s1 rdf:type rdf:Statement .
_:s1 rdf:subject :JaneDoe .
_:s1 rdf:predicate :knows .
_:s1 rdf:object :JohnDoe .
_:s1 :knowsFrom "Berlin" .

:ref_s2 rdf:type rdf:Statement .
:ref_s2 rdf:subject :JaneDoe .
:ref_s2 rdf:predicate :knows .
:ref_s2 rdf:object :JohnDoe .
:ref_s2 :knowsSince 1988 .
```

아래 예제에서는 다음과 같은 SPARQL 쿼리를 사용하여 리소스 `:JaneDoe`에 대한 설명을 요청한다고 가정합니다.

```
DESCRIBE <https://example.com/JaneDoe>
```

## `describeMode` SPARQL 쿼리 힌트
<a name="sparql-query-hints-describeMode"></a>

`hint:describeMode` SPARQL 쿼리 힌트는 Neptune에서 지원하는 다음 SPARQL `DESCRIBE` 모드 중 하나를 선택하는 데 사용됩니다.

### `ForwardOneStep` DESCRIBE 모드
<a name="sparql-query-hints-describeMode-ForwardOneStep"></a>

다음과 같이 `describeMode` 쿼리 힌트를 사용하여 `ForwardOneStep` 모드를 간접적으로 호출합니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
DESCRIBE <https://example.com/JaneDoe>
{
  hint:Query hint:describeMode "ForwardOneStep"
}
```

이 `ForwardOneStep` 모드는 설명할 리소스의 속성과 전달 링크만 반환합니다. 이 예제에서는 다음과 같이 설명할 리소스인 `:JaneDoe`를 보유한 트리플을 반환합니다.

```
:JaneDoe :firstName "Jane" .
:JaneDoe :knows :JohnDoe .
:JaneDoe :knows _:b301990159 .
```

참고로 DESCRIBE 쿼리는 입력 데이터 세트와 비교하여 매번 ID가 다른 빈 노드가 있는 트리플을 반환할 수 있습니다(예: `_:b301990159`).

### `SymmetricOneStep` DESCRIBE 모드
<a name="sparql-query-hints-describeMode-SymmetricOneStep"></a>

`SymmetricOneStep`은 쿼리 힌트를 제공하지 않는 경우의 기본 DESCRIBE 모드입니다. 다음과 같이 `describeMode` 쿼리 힌트를 사용하여 명시적으로 간접 호출할 수도 있습니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
DESCRIBE <https://example.com/JaneDoe>
{
  hint:Query hint:describeMode "SymmetricOneStep"
}
```

`SymmetricOneStep` 시맨틱에서 `DESCRIBE`는 설명할 리소스의 속성, 정방향 링크 및 역방향 링크를 반환합니다.

```
:JaneDoe :firstName "Jane" .
:JaneDoe :knows :JohnDoe .
:JaneDoe :knows _:b318767375 .

_:b318767631 rdf:subject :JaneDoe .

:RichardRoe :knows :JaneDoe .

:ref_s2 rdf:subject :JaneDoe .
```

### 간결한 경계 설명(`CBD`) DESCRIBE 모드
<a name="sparql-query-hints-describeMode-CBD"></a>

간결한 경계 설명(`CBD`) 모드는 다음과 같은 `describeMode` 쿼리 힌트를 사용하여 간접적으로 호출됩니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
DESCRIBE <https://example.com/JaneDoe>
{
  hint:Query hint:describeMode "CBD"
}
```

`CBD` 시맨틱에 따라 `DESCRIBE`는 설명할 리소스의 간결한 경계 설명([W3C에서 정의한](http://www.w3.org/Submission/CBD) 대로)을 반환합니다.

```
:JaneDoe :firstName "Jane" .
:JaneDoe :knows :JohnDoe .
:JaneDoe :knows _:b285212943 .
_:b285212943 :knows :RichardRoe .

_:b285213199 rdf:subject :JaneDoe .
_:b285213199 rdf:type rdf:Statement .
_:b285213199 rdf:predicate :knows .
_:b285213199 rdf:object :JohnDoe .
_:b285213199 :knowsFrom "Berlin" .

:ref_s2 rdf:subject :JaneDoe .
```

RDF 리소스, 즉 RDF 그래프의 노드에 대한 간결한 경계 설명은 단독으로 사용할 수 있는 해당 노드를 중심으로 하는 가장 작은 하위 그래프입니다. 실제로 이는 그래프를 루트로 지정된 노드를 사용하는 트리라고 생각하면 트리에 잎이 있는 것처럼 빈 노드(bnode)가 없다는 의미입니다. bnode는 외부에서 주소를 지정하거나 후속 쿼리에 사용할 수 없으므로, 현재 노드에서 다음 단일 홉을 찾기 위해 그래프를 탐색하는 것만으로는 충분하지 않습니다. 또한 후속 쿼리에 사용할 수 있는 항목(bnode 이외의 항목)을 충분히 찾아내야 합니다.

#### CBD 컴퓨팅
<a name="sparql-query-hints-describeMode-CBD-computing"></a>

소스 RDF 그래프의 특정 노드(시작 노드 또는 루트)가 주어지면 해당 노드의 CBD는 다음과 같이 계산됩니다.

1. 문의 *주제*가 시작 노드인 소스 그래프의 모든 문을 하위 그래프에 포함하세요.

1. 재귀적으로, 지금까지 빈 노드 *객체*가 있는 하위 그래프의 모든 문에 대해서는 문의 *주제*가 빈 노드이고 아직 하위 그래프에 포함되지 않은 소스 그래프의 모든 문을 하위 그래프에 포함합니다.

1. 재귀적으로, 지금까지 하위 그래프에 포함된 모든 문의 경우 소스 그래프에 있는 이러한 문의 모든 구체화에는 각 구체화의 `rdf:Statement` 노드에서 시작하는 CBD가 포함됩니다.

그러면 *객체* 노드가 IRI 참조 또는 리터럴이거나 빈 노드가 그래프에서 문의 *주제*로 사용되지 않는 하위 그래프가 생성됩니다. 단, 단일 SPARQL SELECT 또는 CONSTRUCT 쿼리로는 CBD를 계산할 수 없습니다.

### 간결한 대칭적 경계 설명(`SCBD`) DESCRIBE 모드
<a name="sparql-query-hints-describeMode-SCBD"></a>

간결한 대칭적 경계 설명(`SCBD`) 모드는 다음과 같은 `describeMode` 쿼리 힌트를 사용하여 간접적으로 호출됩니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
DESCRIBE <https://example.com/JaneDoe>
{
  hint:Query hint:describeMode "SCBD"
}
```

`SCBD` 시맨틱에 따라 `DESCRIBE`는 W3C가 [VoID 어휘를 사용하여 연결된 데이터 세트 설명](http://www.w3.org/TR/void/)에서 정의한 대로 리소스의 간결한 대칭적 경계 설명을 반환합니다.

```
:JaneDoe :firstName "Jane" .
:JaneDoe :knows :JohnDoe .
:JaneDoe :knows _:b335544591 .
_:b335544591 :knows :RichardRoe .

:RichardRoe :knows :JaneDoe .

_:b335544847 rdf:subject :JaneDoe .
_:b335544847 rdf:type rdf:Statement .
_:b335544847 rdf:predicate :knows .
_:b335544847 rdf:object :JohnDoe .
_:b335544847 :knowsFrom "Berlin" .

:ref_s2 rdf:subject :JaneDoe .
```

`ForwardOneStep` 및 `SymmetricOneStep` 모드에 비해 CBD와 SCBD의 장점은 빈 노드가 항상 해당 표현을 포함하도록 확장된다는 것입니다. SPARQL을 사용하여 빈 노드를 쿼리할 수 없기 때문에 이는 중요한 이점일 수 있습니다. 또한 CBD 및 SCBD 모드에서는 구체화도 고려합니다.

참고로 `describeMode` 쿼리 힌트는 `WHERE` 절의 일부일 수도 있습니다.

```
PREFIX hint: <http://aws.amazon.com/neptune/vocab/v01/QueryHints#>
DESCRIBE ?s
WHERE {
  hint:Query hint:describeMode "CBD" .
  ?s rdf:type <https://example.com/Person>
}
```

## `describeIterationLimit` SPARQL 쿼리 힌트
<a name="sparql-query-hints-describeIterationLimit"></a>

`hint:describeIterationLimit` SPARQL 쿼리 힌트는 CBD 및 SCBD와 같은 반복적 DESCRIBE 알고리즘에 대해 수행할 최대 반복 확장 횟수에 대한 **선택적** 제약 조건을 제공합니다.

DESCRIBE 제한은 AND로 연결됩니다. 따라서 반복 제한과 문 제한을 둘 다 지정하는 경우 DESCRIBE 쿼리를 끊기 전에 두 제한을 모두 충족해야 합니다.

이 값의 기본값은 5입니다. 이 값을 0으로 설정하여 반복 확장 횟수에 제한을 두지 않도록 지정할 수 있습니다.

## `describeStatementLimit` SPARQL 쿼리 힌트
<a name="sparql-query-hints-describeStatementLimit"></a>

`hint:describeStatementLimit` SPARQL 쿼리 힌트는 DESCRIBE 쿼리 응답에 존재할 수 있는 최대 문 수에 대한 **선택적** 제약 조건을 제공합니다. CBD 및 SCBD와 같은 반복적인 DESCRIBE 알고리즘에만 적용됩니다.

DESCRIBE 제한은 AND로 연결됩니다. 따라서 반복 제한과 문 제한을 둘 다 지정하는 경우 DESCRIBE 쿼리를 끊기 전에 두 제한을 모두 충족해야 합니다.

이 값의 기본값은 5,000입니다. 반환되는 문 수에 제한을 두지 않도록 지정하려면 이 값을 0으로 설정하면 됩니다.