

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 与 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 查询可能会返回带有空白节点的三元组`_:b301990159`，例如，与输入数据集相比， IDs 每次都不同。

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

使用 `describeMode` 查询提示调用简明界限描述 (`CBD`) 模式，如下所示：

```
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)。由于空白节点无法在外部寻址，也无法在后续查询中使用，因此仅仅浏览图形来查找当前节点中接下来的一个或多个单跳是不够的。您还必须找到可以在后续查询中使用的节点（即空白节点以外的节点）。

#### 计算 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>

使用 `describeMode` 查询提示调用对称简明界限描述 (`SCBD`) 模式，如下所示：

```
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 查询提示为要针对迭代 DESCRIBE 算法（例如 CBD 和 SCBD）执行的最大迭代扩展次数提供了一个**可选**约束。

描述限制 ANDed 合而为一。因此，如果同时指定了迭代限制和语句限制，则必须同时满足这两个限制，然后才能断开 DESCRIBE 查询。

此值的默认值为 5。您可以将其设置为零 (0)，以指定对迭代扩展的数量没有限制。

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

`hint:describeStatementLimit` SPARQL 查询提示提供了对 DESCRIBE 查询响应中可能存在的最大语句数的**可选**约束。它仅适用于迭代 DESCRIBE 算法，例如 CBD 和 SCBD。

描述限制 ANDed 合而为一。因此，如果同时指定了迭代限制和语句限制，则必须同时满足这两个限制，然后才能断开 DESCRIBE 查询。

此值的默认值为 5000。您可以将其设置为零 (0)，以指定对返回的语句数量没有限制。