

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

# Neptune SPARQL `explain` 运算符
<a name="sparql-explain-operators"></a>

以下部分介绍 Amazon Neptune 中当前可用的 SPARQL `explain` 特征的运算符和参数。

**重要**  
SPARQL `explain` 功能仍在不断优化中。此处记录的运算符和参数可能会在未来版本中发生更改。

**Topics**
+ [

## `Aggregation` 运算符
](#sparql-explain-operator-aggregation)
+ [

## `ConditionalRouting` 运算符
](#sparql-explain-operator-conditional-routing)
+ [

## `Copy` 运算符
](#sparql-explain-operator-copy)
+ [

## `DFENode` 运算符
](#sparql-explain-operator-dfenode)
+ [

## `Distinct` 运算符
](#sparql-explain-operator-distinct)
+ [

## `Federation` 运算符
](#sparql-explain-operator-federation)
+ [

## `Filter` 运算符
](#sparql-explain-operator-filter)
+ [

## `HashIndexBuild` 运算符
](#sparql-explain-operator-hash-index-build)
+ [

## `HashIndexJoin` 运算符
](#sparql-explain-operator-hash-index-join)
+ [

## `MergeJoin` 运算符
](#sparql-explain-operator-merge-join)
+ [

## `NamedSubquery` 运算符
](#sparql-explain-operator-named-subquery)
+ [

## `PipelineJoin` 运算符
](#sparql-explain-operator-pipeline-join)
+ [

## `PipelineCountJoin` 运算符
](#sparql-explain-operator-pipeline-count-join)
+ [

## `PipelinedHashIndexJoin` 运算符
](#sparql-explain-operator-pipeline-hash-index-join)
+ [

## `Projection` 运算符
](#sparql-explain-operator-projection)
+ [

## `PropertyPath` 运算符
](#sparql-explain-operator-property-path)
+ [

## `TermResolution` 运算符
](#sparql-explain-operator-term-resolution)
+ [

## `Slice` 运算符
](#sparql-explain-operator-slice)
+ [

## `SolutionInjection` 运算符
](#sparql-explain-operator-solution-injection)
+ [

## `Sort` 运算符
](#sparql-explain-operator-sort)
+ [

## `VariableAlignment` 运算符
](#sparql-explain-operator-variable-alignment)

## `Aggregation` 运算符
<a name="sparql-explain-operator-aggregation"></a>

执行一个或多个聚合，同时实现 SPARQL 聚合运算符（如 `count`、`max`、`min`、`sum` 等）的语义。

`Aggregation` 带有使用 `groupBy` 子句的可选分组和可选 `having` 约束。

**参数**
+ `groupBy` -（*可选*）提供一个 `groupBy` 子句，该子句指定作为传入解的分组依据的表达式序列。
+ `aggregates` -（*必需*）指定聚合表达式的排序列表。
+ `having` -（*可选*）添加约束以对组进行筛选，与 SPARQL 查询中的 `having` 子句的作用一样。

## `ConditionalRouting` 运算符
<a name="sparql-explain-operator-conditional-routing"></a>

根据某个给定条件路由传入解。满足该条件的解将会路由到 `Out #1` 引用的运算符 ID，而未满足该条件的解将不会路由到 `Out #2` 引用的运算符。

**参数**
+ `condition` -（*必需*）路由条件。

## `Copy` 运算符
<a name="sparql-explain-operator-copy"></a>

根据指定模式指定的方式委派解流。

**模式**
+ `forward` – 将解转发至由 `Out #1` 标识的下游运算符。
+ `duplicate` - 复制解并将其转发至由 `Out #1` 和 `Out #2` 标识的两个运算符中的每一个。

`Copy` 没有任何参数。

## `DFENode` 运算符
<a name="sparql-explain-operator-dfenode"></a>

此运算符是对 DFE 备用查询引擎运行的计划的抽象。该运算符的参数中概述了详细的 DFE 计划。该参数目前已过载，无法包含 DFE 计划的详细运行时系统统计数据。它包含 DFE 在执行查询的各个步骤上所花费的时间。

DFE 查询计划的逻辑优化抽象语法树 (AST) 包含有关在计划时考虑的运算符类型以及运行运算符的相关最佳和最坏情况成本的信息。目前，AST 由以下类型的节点组成：
+ `DFEJoinGroupNode` – 表示一个或多个 `DFEPatternNodes` 的联接。
+ `DFEPatternNode` – 封装一种底层模式，使用该模式将匹配的元组投影到底层数据库之外。

小节 `Statistics & Operator histogram` 包含有关 `DataflowOp` 计划的执行时间和每个运算符使用的 CPU 时间细分的详细信息。下方有一个表，其中包含 DFE 执行的计划的详细运行时系统统计数据。

**注意**  
由于 DFE 是在实验室模式下发布的实验特征，因此其 `explain` 输出的确切格式可能会发生变化。

## `Distinct` 运算符
<a name="sparql-explain-operator-distinct"></a>

计算变量子集上的不同投影，从而消除重复项。因此，流入的解的数量大于或等于流出的解的数量。

**参数**
+ `vars` -（*必需*）要将 `Distinct` 投影应用于的变量。

## `Federation` 运算符
<a name="sparql-explain-operator-federation"></a>

将指定的查询传递到指定的远程 SPARQL 终端节点。

**参数**
+ `endpoint` -（*必需*）SPARQL `SERVICE` 语句中的端点 URL。这可以是常量字符串，或者如果查询终端节点是基于相同查询中的变量确定的，这也可以是变量名。
+ `query` -（*必需*）要发送到远程端点的重构查询字符串。即使客户端未指定任何前缀，引擎也会向该查询添加默认前缀。
+ `silent` -（*必需*）布尔值，指示关键字之后是否出现 `SILENT` 关键字。`SILENT` 告知引擎，即使远程 `SERVICE` 部分失败，也不要使整个查询失败。

## `Filter` 运算符
<a name="sparql-explain-operator-filter"></a>

筛选传入解。只有这些满足筛选条件的解才会转发至上游运算符，而所有其他解将被删除。

**参数**
+ `condition` -（*必需*）筛选条件。

## `HashIndexBuild` 运算符
<a name="sparql-explain-operator-hash-index-build"></a>

将绑定和假脱机的列表置于其名称由 `solutionSet` 参数定义的哈希索引中。通常情况下，后续运算符将针对此解集（根据名称引用）执行联接。

**参数**
+ `solutionSet` -（*必需*）哈希索引解的名称。
+ `sourceType` -（*必需*）从中获取要存储在哈希索引中的绑定的源的类型：
  + `pipeline` - 将来自运算符管道中的下游运算符的传入解假脱机到哈希索引中。
  + `binding set` - 将由 `sourceBindingSet` 参数指定的固定绑定集假脱机到哈希索引中。
+ `sourceBindingSet` -（*可选*）如果 `sourceType` 参数值为 `binding set`，此参数指定要假脱机到哈希索引中的静态绑定集。

## `HashIndexJoin` 运算符
<a name="sparql-explain-operator-hash-index-join"></a>

将传入解与由 `solutionSet` 参数标识的哈希索引解集进行联接。

**参数**
+ `solutionSet` -（*必需*）要对其进行联接的解集的名称。这必须是已在之前某一步中使用 `HashIndexBuild` 运算符构建的哈希索引。
+ `joinType` -（*必需*）要执行的联接类型：
  + `join` - 一个常规联接，要求所有共享变量之间的完全匹配。
  + `optional` - 一个 `optional` 联接，该联接使用 SPARQL `OPTIONAL` 运算符语义。
  + `minus` - `minus` 运算使用 SPARQL `MINUS` 运算符语义保留不存在任何联接合作伙伴的映射。
  + `existence check` - 检查是否有联接合作伙伴，并将 `existenceCheckResultVar` 变量绑定到此检查的结果。
+ `constraints` -（*可选*）联接期间要考虑的其它联接约束。不满足这些约束的联接将被丢弃。
+ `existenceCheckResultVar` -（*可选*）仅用于 `joinType` 等于 `existence check` 的联接（请参阅之前的 `joinType` 参数）。

## `MergeJoin` 运算符
<a name="sparql-explain-operator-merge-join"></a>

针对多个解集的合并联接，由 `solutionSets` 参数标识。

**参数**
+ `solutionSets` -（*必需*）要联接在一起的解集。

## `NamedSubquery` 运算符
<a name="sparql-explain-operator-named-subquery"></a>

触发由 `subQuery` 参数标识的子查询的评估并将结果假脱机到由 `solutionSet` 参数指定的解集中。该运算符的传入解将转发至子查询，然后转发至下一个运算符。

**参数**
+ `subQuery` -（*必需*）要计算的子查询的名称。子查询将在输出中明确显示。
+ `solutionSet` -（*必需*）要在其中存储子查询结果的解集的名称。

## `PipelineJoin` 运算符
<a name="sparql-explain-operator-pipeline-join"></a>

接收上一个运算符的输出作为输入并将它与 `pattern` 参数定义的元组模式进行联接。

**参数**
+ `pattern`—（*必需*）模式，其形式为连接底层的图元组 subject-predicate-object，可选为-graph 元组。如果为该模式指定 `distinct`，联接将仅从由 `projectionVars` 参数指定的投影变量中提取不同的解，而不是所有匹配的解。
+ `inlineFilters` -（*可选*）要应用于模式中的变量的一组筛选条件。将结合这些筛选条件对模式进行评估。
+ `joinType` -（*必需*）要执行的联接类型：
  + `join` - 一个常规联接，要求所有共享变量之间的完全匹配。
  + `optional` - 一个 `optional` 联接，该联接使用 SPARQL `OPTIONAL` 运算符语义。
  + `minus` - `minus` 运算使用 SPARQL `MINUS` 运算符语义保留不存在任何联接合作伙伴的映射。
  + `existence check` - 检查是否有联接合作伙伴，并将 `existenceCheckResultVar` 变量绑定到此检查的结果。
+ `constraints` -（*可选*）联接期间要考虑的其它联接约束。不满足这些约束的联接将被丢弃。
+ `projectionVars` -（*可选*）投影变量。与 `distinct := true` 结合使用以强制提取某指定变量集中的不同投影。
+ `cutoffLimit` -（*可选*）提取的联接合作伙伴的数量的截止限制。尽管默认情况下没有任何限制，但您可以在执行联接时将此值设置为 1 以实施 `FILTER (NOT) EXISTS` 子句，这样可足以证明或反证是否有联接合作伙伴。

## `PipelineCountJoin` 运算符
<a name="sparql-explain-operator-pipeline-count-join"></a>

`PipelineJoin` 的变体。它仅对匹配的联接合作伙伴进行计数并将计数绑定到由 `countVar` 参数指定的变量，而不是进行联接。

**参数**
+ `countVar` -（*必需*）应将计数结果（即联接合作伙伴的数量）绑定到的变量。
+ `pattern`—（*必需*）模式，其形式为连接底层的图元组 subject-predicate-object，可选为-graph 元组。如果为该模式指定 `distinct`，联接将仅从由 `projectionVars` 参数指定的投影变量中提取不同的解，而不是所有匹配的解。
+ `inlineFilters` -（*可选*）要应用于模式中的变量的一组筛选条件。将结合这些筛选条件对模式进行评估。
+ `joinType` -（*必需*）要执行的联接类型：
  + `join` - 一个常规联接，要求所有共享变量之间的完全匹配。
  + `optional` - 一个 `optional` 联接，该联接使用 SPARQL `OPTIONAL` 运算符语义。
  + `minus` - `minus` 运算使用 SPARQL `MINUS` 运算符语义保留不存在任何联接合作伙伴的映射。
  + `existence check` - 检查是否有联接合作伙伴，并将 `existenceCheckResultVar` 变量绑定到此检查的结果。
+ `constraints` -（*可选*）联接期间要考虑的其它联接约束。不满足这些约束的联接将被丢弃。
+ `projectionVars` -（*可选*）投影变量。与 `distinct := true` 结合使用以强制提取某指定变量集中的不同投影。
+ `cutoffLimit` -（*可选*）提取的联接合作伙伴的数量的截止限制。尽管默认情况下没有任何限制，但您可以在执行联接时将此值设置为 1 以实施 `FILTER (NOT) EXISTS` 子句，这样可足以证明或反证是否有联接合作伙伴。

## `PipelinedHashIndexJoin` 运算符
<a name="sparql-explain-operator-pipeline-hash-index-join"></a>

这是一个 all-in-one生成哈希索引和连接运算符。它获取一个绑定列表，将绑定假脱机到哈希索引中，然后根据哈希索引连接传入的解。

**参数**
+ `sourceType` -（*必需*）从中获取要存储在哈希索引中的绑定的源的类型，如下一种：
  + `pipeline` - 使 `PipelinedHashIndexJoin` 将来自运算符管道中的下游运算符的传入解假脱机到哈希索引中。
  + `binding set` - 使 `PipelinedHashIndexJoin` 将由 `sourceBindingSet` 参数指定的固定绑定集假脱机到哈希索引中。
+ `sourceSubQuery ` –（*可选*）如果 `sourceType` 参数值为 `pipeline`，则此参数指定要计算并假脱机到哈希索引中的子查询。
+ `sourceBindingSet ` –（*可选*）如果 `sourceType` 参数值为 `binding set`，此参数指定要假脱机到哈希索引中的静态绑定集。
+ `joinType` -（*必需*）要执行的联接类型：
  + `join` - 一个常规联接，要求所有共享变量之间的完全匹配。
  + `optional` - 一个 `optional` 联接，该联接使用 SPARQL `OPTIONAL` 运算符语义。
  + `minus` - `minus` 运算使用 SPARQL `MINUS` 运算符语义保留不存在任何联接合作伙伴的映射。
  + `existence check` - 检查是否有联接合作伙伴，并将 `existenceCheckResultVar` 变量绑定到此检查的结果。
+ `existenceCheckResultVar` –（*可选*）仅用于 `joinType` 等于 `existence check` 的联接（请参阅上面的 joinType 参数）。

## `Projection` 运算符
<a name="sparql-explain-operator-projection"></a>

针对变量子集投影。流入的解数量等于流出的解数量，但解的形状有所不同，具体取决于模式设置。

**模式**
+ `retain` - 仅保留解中由 `vars` 参数指定的变量。
+ `drop` - 删除由 `vars` 参数指定的所有变量。

**参数**
+ `vars` -（*必需*）要保留或删除的变量，取决于模式设置。

## `PropertyPath` 运算符
<a name="sparql-explain-operator-property-path"></a>

启用递归属性路径，例如 `+` 或 `*`。Neptune 基于 `iterationTemplate` 参数指定的模板实现了定点迭代方法。已知的左侧或右侧变量将在每次固定点迭代中绑定到模板中，直到再也找不到新解。

**参数**
+ `iterationTemplate` -（*必需*）用于实施固定点迭代的子查询模板的名称。
+ `leftTerm` -（*必需*）属性路径左侧的术语（变量或常量）。
+ `rightTerm` -（*必需*）属性路径右侧的术语（变量或常量）。
+ `lowerBound` -（*必需*）固定点迭代的下限（`*` 查询的下限为 `0`，或 `+` 查询的下限为 `1`）。

## `TermResolution` 运算符
<a name="sparql-explain-operator-term-resolution"></a>

将内部字符串标识符值转换回其相应的外部字符串，或将外部字符串转换为内部字符串标识符值，具体取决于模式。

**模式**
+ `value2id`— 将诸如文字之类的术语映射 URIs 到相应的内部 ID 值（编码为内部值）。
+ `id2value`— 将内部 ID 值映射到相应的术语，例如文字和 URIs （内部值的解码）。

**参数**
+ `vars`—（*必需*）指定 IDs 应映射其字符串或内部字符串的变量。

## `Slice` 运算符
<a name="sparql-explain-operator-slice"></a>

在传入解流中使用 SPARQL 的 `LIMIT` 和 `OFFSET` 子句的语义实施切片。

**参数**
+ `limit` –（*可选*）针对要进行转发的解的限制。
+ `offset` –（*可选*）用于计算解以进行转发的偏移。

## `SolutionInjection` 运算符
<a name="sparql-explain-operator-solution-injection"></a>

未接收输入。将解静态注入查询计划中并将其记录在 `solutions` 参数中。

查询计划始终以此静态注入开始。如果要注入的静态解可通过组合各种来源的静态绑定（例如，来自 `VALUES` 或 `BIND` 子句）从查询本身进行派生，则 `SolutionInjection` 运算符将注入这些派生的静态解。在最简单的情况下，这些反映了外部 `VALUES` 子句所隐含的绑定。

如果没有任何静态解可从查询派生，`SolutionInjection` 将注入空的所谓的通用解，它将在整个查询-评估过程中进行扩展和增加。

**参数**
+ `solutions` -（*必需*）该运算符注入的解的序列。

## `Sort` 运算符
<a name="sparql-explain-operator-sort"></a>

使用指定的排序条件对解集排序。

**参数**
+ `sortOrder` -（*必需*）变量的排序列表，每个变量包含一个 `ASC`（升序）或 `DESC`（降序）标识符，用于对解集排序。

## `VariableAlignment` 运算符
<a name="sparql-explain-operator-variable-alignment"></a>

逐个检查解，同时对两个变量中的每个变量执行对齐：指定的 `sourceVar` 和指定的 `targetVar`。

如果解中的 `sourceVar` 和 `targetVar` 具有相同的值，则这些变量将被视为对齐并将转发解，同时会投影出多余的 `sourceVar`。

如果这些变量绑定到不同的值，则将完全筛选出该解。

**参数**
+ `sourceVar` -（*必需*）要与目标变量比较的源变量。如果解中的对齐成功，则表示这两个变量具有相同的值，将投影出源变量。
+ `targetVar` -（*必需*）要与源变量进行比较的目标变量。即使在对齐成功时也将保留。