

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

# Neptune SPARQL `explain` 연산자
<a name="sparql-explain-operators"></a>

다음 섹션에서는 현재 Amazon Neptune에서 사용할 수 있는 SPARQL `explain` 기능의 연산자와 파라미터에 대해 설명합니다.

**중요**  
SPARQL `explain` 기능은 계속 개선되고 있습니다. 여기에 설명된 연산자와 파라미터는 향후 버전에서 변경될 수 있습니다.

**Topics**
+ [

## `Aggregation` 연산자
](#sparql-explain-operator-aggregation)
+ [

## `ConditionalRouting` 연산자
](#sparql-explain-operator-conditional-routing)
+ [

## `Copy` 연산자
](#sparql-explain-operator-copy)
+ [

## `DFENode` 연산자
](#sparql-explain-operator-dfenode)
+ [

## `Distinct` 연산자
](#sparql-explain-operator-distinct)
+ [

## `Federation` 연산자
](#sparql-explain-operator-federation)
+ [

## `Filter` 연산자
](#sparql-explain-operator-filter)
+ [

## `HashIndexBuild` 연산자
](#sparql-explain-operator-hash-index-build)
+ [

## `HashIndexJoin` 연산자
](#sparql-explain-operator-hash-index-join)
+ [

## `MergeJoin` 연산자
](#sparql-explain-operator-merge-join)
+ [

## `NamedSubquery` 연산자
](#sparql-explain-operator-named-subquery)
+ [

## `PipelineJoin` 연산자
](#sparql-explain-operator-pipeline-join)
+ [

## `PipelineCountJoin` 연산자
](#sparql-explain-operator-pipeline-count-join)
+ [

## `PipelinedHashIndexJoin` 연산자
](#sparql-explain-operator-pipeline-hash-index-join)
+ [

## `Projection` 연산자
](#sparql-explain-operator-projection)
+ [

## `PropertyPath` 연산자
](#sparql-explain-operator-property-path)
+ [

## `TermResolution` 연산자
](#sparql-explain-operator-term-resolution)
+ [

## `Slice` 연산자
](#sparql-explain-operator-slice)
+ [

## `SolutionInjection` 연산자
](#sparql-explain-operator-solution-injection)
+ [

## `Sort` 연산자
](#sparql-explain-operator-sort)
+ [

## `VariableAlignment` 연산자
](#sparql-explain-operator-variable-alignment)

## `Aggregation` 연산자
<a name="sparql-explain-operator-aggregation"></a>

하나 이상의 집계를 수행하며, `count`, `max`, `min`, `sum` 등 SPARQL 집계 연산자의 의미 체계를 구현합니다.

`Aggregation`은 `groupBy` 절을 통한 선택적 그룹화 및 선택적 `having` 제약 조건과 함께 제공됩니다.

**인수**
+ `groupBy` – (*선택 사항*) 그룹화되는 수신 솔루션에 따라 표현식의 시퀀스를 지정하는 `groupBy` 절을 제공합니다.
+ `aggregates` – (*필수*) 집계 표현식의 순서가 지정된 목록을 지정합니다.
+ `having` – (*선택 사항*) SPARQL 쿼리의 `having` 절이 암시하는 대로 그룹의 필터에 제약 조건을 추가합니다.

## `ConditionalRouting` 연산자
<a name="sparql-explain-operator-conditional-routing"></a>

지정된 조건에 따라 수신 솔루션을 라우팅합니다. 조건을 충족하는 솔루션은 `Out #1`에서 참조하는 연산자 ID로 라우팅되지만, 충족하지 않는 솔루션은 `Out #2`에서 참조하는 연산자로 라우팅됩니다.

**인수**
+ `condition` – (*필수*) 라우팅 조건입니다.

## `Copy` 연산자
<a name="sparql-explain-operator-copy"></a>

지정된 모드에서 지정한 대로 솔루션 스트림을 위임합니다.

**Modes**
+ `forward` – `Out #1`에서 식별된 다운스트림 연산자로 솔루션을 전달합니다.
+ `duplicate` – 솔루션을 복제하고 각각 `Out #1` 및 `Out #2`에서 식별된 두 연산자로 전달합니다.

`Copy`에는 인수가 없습니다.

## `DFENode` 연산자
<a name="sparql-explain-operator-dfenode"></a>

이 연산자는 DFE 대체 쿼리 엔진에서 실행되는 계획을 추상화한 것입니다. 자세한 DFE 계획은 이 연산자의 인수에 요약되어 있습니다. 현재 인수는 DFE 계획의 자세한 런타임 통계를 포함하도록 오버로드되었습니다. 여기에는 DFE가 쿼리를 실행하는 다양한 단계에 소요된 시간이 포함됩니다.

DFE 쿼리 계획에 대해 논리적으로 최적화된 추상 구문 트리(AST)에는 계획 시 고려했던 연산자 유형 정보와 연산자를 실행하는 데 드는 관련 최적/최악의 경우에 해당하는 비용 정보가 출력되어 있습니다. AST는 현재 다음과 같은 유형의 노드로 구성되어 있습니다.
+ `DFEJoinGroupNode`   –   하나 이상의 `DFEPatternNodes` 조인을 나타냅니다.
+ `DFEPatternNode`   –   일치하는 튜플을 기본 데이터베이스 밖으로 투영하는 데 사용하는 기본 패턴을 캡슐화합니다.

하위 섹션 `Statistics & Operator histogram`에는 `DataflowOp` 계획의 실행 시간 및 각 연산자가 사용한 CPU 시간 분류에 대한 세부 정보가 포함되어 있습니다. 이 아래에는 DFE에서 실행한 계획의 상세한 런타임 통계를 출력하는 표가 있습니다.

**참고**  
DFE는 랩 모드에서 출시된 실험용 기능이므로, 정확한 `explain` 출력 형식이 변경될 수 있습니다.

## `Distinct` 연산자
<a name="sparql-explain-operator-distinct"></a>

변수의 하위 집합에서 개별 프로젝션을 컴퓨팅하여 중복을 제거합니다. 따라서 유입되는 솔루션의 수는 유출되는 솔루션의 수보다 크거나 같습니다.

**인수**
+ `vars` – (*필수*) `Distinct` 프로젝션을 적용할 변수입니다.

## `Federation` 연산자
<a name="sparql-explain-operator-federation"></a>

지정된 원격 SPARQL 엔드포인트에 지정된 쿼리를 전달합니다.

**인수**
+ `endpoint` – (*필수*) SPARQL `SERVICE` 문의 엔드포인트 URL입니다. 이는 상수 문자열일 수 있고, 동일한 쿼리 내의 변수를 토대로 쿼리 엔드포인트가 결정된 경우에는 변수 이름일 수도 있습니다.
+ `query` – (*필수*) 원격 엔드포인트로 전송되는 재구성된 쿼리 문자열입니다. 클라이언트가 지정하지 않더라도 엔진은 이 쿼리에 기본 접두사를 추가합니다.
+ `silent` – (*필수*) 해당 키워드 뒤에 `SILENT` 키워드가 나타났는지 여부를 표시하는 부울 값입니다. `SILENT`는 원격 `SERVICE` 부분이 실패하더라도 전체 쿼리가 실패하지 않도록 엔진에 명령합니다.

## `Filter` 연산자
<a name="sparql-explain-operator-filter"></a>

필터는 수신 솔루션입니다. 필터 조건을 충족하는 솔루션만 업스트림 연산자로 전달되며, 다른 모든 솔루션은 삭제됩니다.

**인수**
+ `condition` – (*필수*) 필터 조건입니다.

## `HashIndexBuild` 연산자
<a name="sparql-explain-operator-hash-index-build"></a>

바인딩 목록을 가져와 `solutionSet` 인수로 정의된 이름이 있는 해시 인덱스에 스풀링합니다. 일반적으로 후속 연산자는 이 솔루션 집합에 대해 조인을 수행하며 해당 이름으로 참조합니다.

**인수**
+ `solutionSet` – (*필수*) 해시 인덱스 솔루션 세트의 이름입니다.
+ `sourceType` – (*필수*) 해시 인덱스에 저장할 바인딩을 가져올 소스의 유형입니다.
  + `pipeline` – 연산자 파이프라인의 다운스트림 연산자에서 해시 인덱스로 수신 솔루션을 스풀링합니다.
  + `binding set` – 인수로 지정된 고정 바인딩 세트를 해시 인덱스로 스풀링합니다.
+ `sourceBindingSet` – (*선택 사항*) `sourceType` 인수 값이 `binding set`인 경우 이 인수는 해시 인덱스로 스풀링할 정적 바인딩 세트를 지정합니다.

## `HashIndexJoin` 연산자
<a name="sparql-explain-operator-hash-index-join"></a>

수신 솔루션을 `solutionSet` 인수로 식별된 해시 인덱스 솔루션 집합에 조인합니다.

**인수**
+ `solutionSet` – (*필수*) 조인할 솔루션 세트의 이름입니다. 이 이름은 이전 단계에서 `HashIndexBuild` 연산자를 사용하여 구성된 해시 인덱스여야 합니다.
+ `joinType` – (*필수*) 수행할 조인 유형입니다.
  + `join` – 정상 조인이며, 공유된 모든 변수 간 정확하게 일치해야 합니다.
  + `optional` - `optional` 조인으로, SPARQL `OPTIONAL` 연산자 의미 시맨틱을 사용합니다.
  + `minus` – `minus` 작업은 조인 파트너가 없는 매핑을 유지하며, SPARQL `MINUS` 연산자 의미 시맨틱을 사용합니다.
  + `existence check` – 조인 파트너가 있는지 여부를 확인하며, `existenceCheckResultVar` 변수를 이 확인 결과에 바인딩합니다.
+ `constraints` – (*선택 사항*) 조인 중 고려되는 추가 조인 제약 조건입니다. 이러한 제약 조건을 충족하지 않는 조인은 삭제됩니다.
+ `existenceCheckResultVar` – (*선택 사항*) `joinType`이 `existence check`와 동일한 조인에 대해서만 사용됩니다(이전 `joinType` 인수 참조).

## `MergeJoin` 연산자
<a name="sparql-explain-operator-merge-join"></a>

`solutionSets` 인수로 식별된 대로 여러 솔루션 집합에 대한 병합 조인입니다.

**인수**
+ `solutionSets` – (*필수*) 함께 조인할 솔루션 세트입니다.

## `NamedSubquery` 연산자
<a name="sparql-explain-operator-named-subquery"></a>

`subQuery` 인수로 식별된 하위 쿼리의 평가를 트리거하고 결과를 `solutionSet` 인수로 지정된 솔루션 집합에 스풀링합니다. 연산자에 대한 수신 솔루션은 하위 쿼리로 전달된 후 다음 연산자로 전달됩니다.

**인수**
+ `subQuery` – (*필수*) 평가할 하위 쿼리의 이름입니다. 하위 쿼리는 명시적으로 출력에 렌더링됩니다.
+ `solutionSet` – (*필수*) 하위 쿼리 결과를 저장할 솔루션 세트의 이름입니다.

## `PipelineJoin` 연산자
<a name="sparql-explain-operator-pipeline-join"></a>

이전 연산자의 출력을 입력으로 받으며, `pattern` 인수로 정의된 튜플 패턴에 조인합니다.

**인수**
+ `pattern` – (*필수*) subject-predicate-object 형식이며, 경우에 따라 조인의 기반이 되는 -graph 튜플입니다. 패턴에 대해 `distinct`가 지정되면 조인은 일치하는 모든 솔루션이 아닌 `projectionVars` 인수로 지정된 프로젝션 변수의 개별 솔루션만 추출합니다.
+ `inlineFilters` – (*선택 사항*) 패턴의 변수에 적용할 필터 세트입니다. 패턴은 이러한 필터와 함께 평가됩니다.
+ `joinType` – (*필수*) 수행할 조인 유형입니다.
  + `join` – 정상 조인이며, 공유된 모든 변수 간 정확하게 일치해야 합니다.
  + `optional` - `optional` 조인으로, SPARQL `OPTIONAL` 연산자 의미 시맨틱을 사용합니다.
  + `minus` – `minus` 작업은 조인 파트너가 없는 매핑을 유지하며, SPARQL `MINUS` 연산자 의미 시맨틱을 사용합니다.
  + `existence check` – 조인 파트너가 있는지 여부를 확인하며, `existenceCheckResultVar` 변수를 이 확인 결과에 바인딩합니다.
+ `constraints` – (*선택 사항*) 조인 중 고려되는 추가 조인 제약 조건입니다. 이러한 제약 조건을 충족하지 않는 조인은 삭제됩니다.
+ `projectionVars` – (*선택 사항*) 프로젝션 변수입니다. `distinct := true`와 함께 사용되어 지정된 변수 집합에 대해 개별 프로젝션을 추출합니다.
+ `cutoffLimit` – (*선택 사항*) 추출된 조인 파트너의 수에 대한 차단 제한입니다. 기본적으로는 제한이 없지만, `FILTER (NOT) EXISTS` 절을 구현하기 위해 조인을 수행할 때 이 값을 1로 설정할 수 있습니다. 1은 조인 파트너가 있음을 증명하거나 반증하기에 충분합니다.

## `PipelineCountJoin` 연산자
<a name="sparql-explain-operator-pipeline-count-join"></a>

`PipelineJoin`의 변형입니다. 조인하는 대신 일치하는 조인 파트너를 계수하고 해당 개수를 `countVar` 인수로 지정된 변수에 바인딩합니다.

**인수**
+ `countVar` – (*필수*) 주로 조인 파트너의 수인 개수 결과를 바인딩할 변수입니다.
+ `pattern` – (*필수*) subject-predicate-object 형식이며, 경우에 따라 조인의 기반이 되는 -graph 튜플입니다. 패턴에 대해 `distinct`가 지정되면 조인은 일치하는 모든 솔루션이 아닌 `projectionVars` 인수로 지정된 프로젝션 변수의 개별 솔루션만 추출합니다.
+ `inlineFilters` – (*선택 사항*) 패턴의 변수에 적용할 필터 세트입니다. 패턴은 이러한 필터와 함께 평가됩니다.
+ `joinType` – (*필수*) 수행할 조인 유형입니다.
  + `join` – 정상 조인이며, 공유된 모든 변수 간 정확하게 일치해야 합니다.
  + `optional` - `optional` 조인으로, SPARQL `OPTIONAL` 연산자 의미 시맨틱을 사용합니다.
  + `minus` – `minus` 작업은 조인 파트너가 없는 매핑을 유지하며, SPARQL `MINUS` 연산자 의미 시맨틱을 사용합니다.
  + `existence check` – 조인 파트너가 있는지 여부를 확인하며, `existenceCheckResultVar` 변수를 이 확인 결과에 바인딩합니다.
+ `constraints` – (*선택 사항*) 조인 중 고려되는 추가 조인 제약 조건입니다. 이러한 제약 조건을 충족하지 않는 조인은 삭제됩니다.
+ `projectionVars` – (*선택 사항*) 프로젝션 변수입니다. `distinct := true`와 함께 사용되어 지정된 변수 집합에 대해 개별 프로젝션을 추출합니다.
+ `cutoffLimit` – (*선택 사항*) 추출된 조인 파트너의 수에 대한 차단 제한입니다. 기본적으로는 제한이 없지만, `FILTER (NOT) EXISTS` 절을 구현하기 위해 조인을 수행할 때 이 값을 1로 설정할 수 있습니다. 1은 조인 파트너가 있음을 증명하거나 반증하기에 충분합니다.

## `PipelinedHashIndexJoin` 연산자
<a name="sparql-explain-operator-pipeline-hash-index-join"></a>

이는 올인원 빌드 해시 인덱스 및 조인 연산자입니다. 바인딩 목록을 가져와 해시 인덱스로 스풀링한 후 수신 솔루션을 해시 인덱스에 조인합니다.

**인수**
+ `sourceType` – (*필수*) 해시 인덱스에 저장할 바인딩을 가져올 소스의 유형으로, 다음 중 하나입니다.
  + `pipeline`  –   `PipelinedHashIndexJoin`이 연산자 파이프라인의 다운스트림 연산자에서 해시 인덱스로 수신 솔루션을 스풀링하도록 합니다.
  + `binding set`  –   `PipelinedHashIndexJoin`이 `sourceBindingSet` 인수로 지정된 고정 바인딩 세트를 해시 인덱스로 스풀링하도록 합니다.
+ `sourceSubQuery `   –   (*선택 사항*) `sourceType` 인수 값이 `pipeline`인 경우 이 인수는 평가되어 해시 인덱스로 스풀링되는 하위 쿼리를 지정합니다.
+ `sourceBindingSet `   –   (*선택 사항*) `sourceType` 인수 값이 `binding set`인 경우 이 인수는 해시 인덱스로 스풀링할 정적 바인딩 세트를 지정합니다.
+ `joinType` – (*필수*) 수행할 조인 유형입니다.
  + `join` – 정상 조인이며, 공유된 모든 변수 간 정확하게 일치해야 합니다.
  + `optional` - `optional` 조인으로, SPARQL `OPTIONAL` 연산자 의미 시맨틱을 사용합니다.
  + `minus` – `minus` 작업은 조인 파트너가 없는 매핑을 유지하며, SPARQL `MINUS` 연산자 의미 시맨틱을 사용합니다.
  + `existence check` – 조인 파트너가 있는지 여부를 확인하며, `existenceCheckResultVar` 변수를 이 확인 결과에 바인딩합니다.
+ `existenceCheckResultVar`   –   (*선택 사항*) `joinType`이 `existence check`와 동일한 조인에 대해서만 사용됩니다(이전 joinType 인수 참조).

## `Projection` 연산자
<a name="sparql-explain-operator-projection"></a>

변수의 하위 집합에 대해 프로젝션합니다. 유입되는 솔루션의 수는 유출되는 솔루션의 수와 같지만, 솔루션의 형태는 모드 설정에 따라 달라집니다.

**Modes**
+ `retain` – `vars` 인수로 지정된 변수만 솔루션에 유지합니다.
+ `drop` – `vars` 인수로 지정된 모든 변수를 삭제합니다.

**인수**
+ `vars` – (*필수*) 모드 설정에 따라 유지하거나 삭제할 변수입니다.

## `PropertyPath` 연산자
<a name="sparql-explain-operator-property-path"></a>

`+` 또는 `*` 기호와 같은 재귀 속성 경로를 활성화합니다. Neptune은 `iterationTemplate` 인수로 지정된 템플릿을 기반으로 고정점 반복 방식을 구현합니다. 더 이상 새로운 솔루션을 찾을 수 없을 때까지 모든 고정점 반복에 대해 알려진 왼쪽 또는 오른쪽 변수가 템플릿에 바인딩됩니다.

**인수**
+ `iterationTemplate` – (*필수*) 고정점 반복을 구현하는 데 사용된 하위 쿼리 템플릿의 이름입니다.
+ `leftTerm` – (*필수*) 속성 경로의 왼쪽에 있는 조건(변수 또는 상수)입니다.
+ `rightTerm` – (*필수*) 속성 경로의 오른쪽에 있는 조건(변수 또는 상수)입니다.
+ `lowerBound` – (*필수*) 고정점 반복에 대한 하한값입니다(`*` 쿼리의 경우 `0` 또는 `+` 쿼리의 경우 `1`).

## `TermResolution` 연산자
<a name="sparql-explain-operator-term-resolution"></a>

모드에 따라 내부 문자열 식별자 값을 해당하는 외부 문자열로 변환하거나, 외부 문자열을 내부 문자열 식별자 값으로 변환합니다.

**Modes**
+ `value2id` – 리터럴 및 URI와 같은 조건을 해당하는 내부 ID 값에 매핑합니다(내부 값에 대한 인코딩).
+ `id2value` – 내부 ID 값을 리터럴 및 URI와 같은 해당 조건에 매핑합니다(내부 값의 디코딩).

**인수**
+ `vars` – (*필수*) 문자열 또는 내부 문자열 ID를 매핑해야 하는 변수를 지정합니다.

## `Slice` 연산자
<a name="sparql-explain-operator-slice"></a>

SPARQL `LIMIT` 및 `OFFSET` 절의 의미 체계를 사용하여 수신 솔루션 스트림에 대해 조각을 구현합니다.

**인수**
+ `limit` – (*선택 사항*) 전달할 솔루션에 대한 제한입니다.
+ `offset` – (*선택 사항*) 전달하기 위해 솔루션을 평가할 오프셋입니다.

## `SolutionInjection` 연산자
<a name="sparql-explain-operator-solution-injection"></a>

입력을 받지 않습니다. 쿼리 계획에 솔루션을 정적으로 삽입하고 `solutions` 인수에 기록합니다.

쿼리 계획은 항상 이 정적 삽입으로 시작합니다. 정적 바인딩의 다양한 소스(예: `VALUES` 또는 `BIND` 절에서)를 조합하여 쿼리 자체에서 삽입할 정적 솔루션을 파생할 수 있는 경우 `SolutionInjection` 연산자는 이러한 파생된 정적 솔루션을 삽입합니다. 가장 간단한 경우에는 외부 `VALUES` 절에 의해 암시된 바인딩을 반영합니다.

쿼리에서 정적 솔루션을 파생할 수 없는 경우 `SolutionInjection`은 비어 있는 범용 솔루션을 삽입합니다. 이 솔루션은 쿼리 평가 프로세스 내내 확장되고 증가됩니다.

**인수**
+ `solutions` – (*필수*) 연산자에 의해 삽입된 솔루션의 시퀀스입니다.

## `Sort` 연산자
<a name="sparql-explain-operator-sort"></a>

지정된 정렬 조건을 사용하여 솔루션 집합을 정렬합니다.

**인수**
+ `sortOrder` – (*필수*) 순서가 지정된 변수 목록이며, 각각 순차적으로 솔루션 세트를 정렬하는 데 사용되는 `ASC`(오름차순) 또는 `DESC`(내림차순) 식별자가 포함되어 있습니다.

## `VariableAlignment` 연산자
<a name="sparql-explain-operator-variable-alignment"></a>

솔루션을 하나씩 검사하여 지정된 `sourceVar` 및 지정된 `targetVar` 변수에 대해 솔루션을 정렬합니다.

솔루션의 `sourceVar` 및 `targetVar`에 동일한 값이 있는 경우 변수가 정렬되었다고 간주되며, 중복 `sourceVar`가 프로젝션된 채로 솔루션이 전달됩니다.

변수가 서로 다른 값에 바인딩되면 솔루션이 전체적으로 필터링됩니다.

**인수**
+ `sourceVar` – (*필수*) 대상 변수와 비교할 소스 변수입니다. 솔루션에서 정렬된 경우(즉, 두 변수에 동일한 값이 있는 경우) 소스 변수가 프로젝션됩니다.
+ `targetVar` – (*필수*) 소스 변수와 비교되는 대상 변수입니다. 정렬된 경우에도 유지됩니다.