

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

# SPARQL DESCRIBE 相对于默认图形的行为
<a name="sparql-default-describe"></a>

SPARQL [https://www.w3.org/TR/sparql11-query/#describe](https://www.w3.org/TR/sparql11-query/#describe) 查询表单允许您在不了解数据结构和不必编写查询的情况下检索有关资源的信息。如何收集这些信息留待 SPARQL 实现来决定。Neptune 提供了[几个查询提示](sparql-query-hints-for-describe.md)，以调用不同的模式和算法供 `DESCRIBE` 使用。

在 Neptune 的实现中，无论模式如何，`DESCRIBE` 都只使用 [SPARQL 默认图形](feature-sparql-compliance.md#sparql-default-graph)中存在的数据。这与 SPARQL 处理数据集的方式一致（请参阅 SPARQL 规范中的[指定 RDF 数据集](https://www.w3.org/TR/sparql11-query/#specifyingDataset)）。

在 Neptune 中，除非使用子句指定了特定的命名图，否则默认图形包含数据库中所有命名图形的并集中的所有唯一三元组。`FROM` and/or `FROM NAMED`Neptune 中的所有 RDF 数据都存储在命名图形中。如果在没有命名图形上下文的情况下插入三元组，Neptune 会将其存储在名为 `http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph` 的命名图形中。

当使用 `FROM` 子句指定一个或多个命名图形时，默认图形是这些命名图形中所有唯一三元组的并集。如果没有 `FROM` 子句但有一个或多个 `FROM NAMED` 子句，则默认图形为空。

## SPARQL `DESCRIBE` 示例
<a name="sparql-default-describe-examples"></a>

请考虑以下数据：

```
PREFIX ex: <https://example.com/>

GRAPH ex:g1 {
    ex:s ex:p1 "a" .
    ex:s ex:p2 "c" .
}

GRAPH ex:g2 {
    ex:s ex:p3 "b" .
    ex:s ex:p2 "c" .
}

ex:s ex:p3 "d" .
```

对于此查询：

```
PREFIX ex: <https://example.com/>
DESCRIBE ?s
FROM ex:g1
FROM NAMED ex:g2
WHERE {
  GRAPH ex:g2 { ?s ?p "b" . }
}
```

Neptune 将返回：

```
ex:s ex:p1 "a" .
ex:s ex:p2 "c" .
```

在此，首先计算图形模式 `GRAPH ex:g2 { ?s ?p "b" }`（这会生成 `?s` 的绑定），然后在默认图形上计算 `DESCRIBE` 部分，现在仅仅是 `ex:g1`。

但是，对于此查询：

```
PREFIX ex: <https://example.com/>
DESCRIBE ?s 
FROM NAMED ex:g1 
WHERE { 
  GRAPH ex:g1 { ?s ?p "a" . } 
}
```

Neptune 不会返回任何内容，因为当存在 `FROM NAMED` 子句而没有任何 `FROM` 子句时，默认图形为空。

在以下查询中，在不存在 `FROM` 或 `FROM NAMED` 子句的情况下使用 `DESCRIBE`：

```
PREFIX ex: <https://example.com/>
DESCRIBE ?s 
WHERE { 
  GRAPH ex:g1 { ?s ?p "a" . } 
}
```

在这种情况下，默认图形由数据库中所有命名图形并集中的所有唯一三元组组成（正式名称为 RDF 合并），因此 Neptune 将返回：

```
ex:s ex:p1 "a" . 
ex:s ex:p2 "c" . 
ex:s ex:p3 "b" .
ex:s ex:p3 "d" .
```