

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

# 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으로 설정하면 됩니다.