

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 與 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 .
```

請注意，DESCRAPE 查詢可能會傳回具有空白節點的三元組 (例如 `_:b301990159`)，與輸入資料集相比，它們每次都有不同的 ID。

### `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 .
```

CBD 和 SCBD 優於 `ForwardOneStep` 和 `SymmetricOneStep` 模式的地方是空白節點始終會擴展以包含其表示法。這可能是一個重要的優勢，因為您無法使用 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 查詢提示會對迭代擴展次數上限提供**選用**限制，而這些擴展是針對迭代 DESCRIBE 演算法 (例如 CBD 和 SCBD) 所執行的。

DESCRIBE 限制是透過 AND 結合在一起。因此，如果同時指定了迭代限制和陳述式限制，則必須符合這兩個限制，然後才能切斷 DESCRIBE 查詢。

此值的預設值為 5。您可以將其設定為 ZERO (0)，對迭代擴展的次數指定無限制。

## `describeStatementLimit` SPARQL 查詢提示
<a name="sparql-query-hints-describeStatementLimit"></a>

`hint:describeStatementLimit` SPARQL 查詢提示會對 SHARECT 查詢回應中可能存在的陳述式數目上限提供「選用」****限制。它僅適用於迭代 DESCRIBE 演算法，例如 CBD 和 SCBD。

DESCRIBE 限制是透過 AND 結合在一起。因此，如果同時指定了迭代限制和陳述式限制，則必須符合這兩個限制，然後才能切斷 DESCRIBE 查詢。

此值的預設值為 5000。您可以將其設定為 ZERO (0)，對傳回的陳述式數目指定無限制。