

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

# SPARQL 查询引擎在 Neptune 中的工作原理
<a name="sparql-explain-engine"></a>

要使用 SPARQL `explain` 特征提供的信息，您需要了解有关 Amazon Neptune SPARQL 查询引擎的工作原理的一些详细信息。

该引擎将每个 SPARQL 查询转换到一个运算符管道中。从第一个运算符开始，称为*绑定列表* 的中间解将流经此运算符管道。您可以将绑定列表视为一个表，其中，表标头是查询中使用的变量的子集。表中的每一行表示一个结果（截至到评估点）。

假设已为我们的数据定义两个命名空间前缀：

```
  @prefix ex:   <http://example.com> .
  @prefix foaf: <http://xmlns.com/foaf/0.1/> .
```

下面将是此上下文中一个简单的绑定列表的示例：

```
  ?person       | ?firstName
  ------------------------------------------------------
  ex:JaneDoe    | "Jane"
  ex:JohnDoe    | "John"
  ex:RichardRoe | "Richard"
```

对于三个人员中的每一个人，列表会将 `?person` 变量绑定到该人员的标识符，并将 `?firstName` 变量绑定到该人员的名字。

在一般情况下，变量可以保持未绑定状态，例如，查询中的某个变量存在 `OPTIONAL` 选项，对于此选项，数据中不存在任何值。

`PipelineJoin` 运算符是 `explain` 输出中存在的 Neptune 查询引擎运算符的示例。它将来自上一个运算符的传入绑定集作为输入，并将其与三元组模式（即 `(?person, foaf:lastName, ?lastName)`）进行联接。此操作在其输入流中使用 `?person` 变量的绑定，将绑定替换到三元组模式中并从数据库中查找三元组。

在来自上一个表的传入绑定的上下文中执行时，`PipelineJoin` 将计算三个查找，即以下内容：

```
  (ex:JaneDoe,    foaf:lastName, ?lastName)
  (ex:JohnDoe,    foaf:lastName, ?lastName)
  (ex:RichardRoe, foaf:lastName, ?lastName)
```

此方法称为*按绑定* 计算。此计算过程的解将与传入的解进行联接，同时在传入的解中填充检测到的 `?lastName`。假设您发现全部三位人员均有一个姓氏，该运算符将生成一个内容如下所示的传出绑定列表：

```
  ?person       | ?firstName | ?lastName
  ---------------------------------------
  ex:JaneDoe    | "Jane"     | "Doe"
  ex:JohnDoe    | "John"     | "Doe"
  ex:RichardRoe | "Richard"  | "Roe"
```

然后，此传出绑定列表将用作管道中的下一个运算符的输入。最后，管道中的最后一个运算符的输出定义查询结果。

运算符管道通常是线性的，这意味着，每个运算符将针对单个连接的运算符发送解。但是，在某些情况下，它们可能具有更复杂的结构。例如，SPARQL 查询中的 `UNION` 运算会将映射到 `Copy` 操作。此操作将复制绑定并将副本转发到两个子计划中，其中一个子计划用于 `UNION` 的左侧，另一个则用于右侧。

有关运算符的更多信息，请参阅[Neptune SPARQL `explain` 运算符](sparql-explain-operators.md)。