SPARQL查询引擎在 Neptune 中的工作原理 - Amazon Neptune

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

SPARQL查询引擎在 Neptune 中的工作原理

要使用该SPARQLexplain功能提供的信息,您需要了解有关 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 的左侧,另一个则用于右侧。

有关运算符的更多信息,请参阅Neptun SPARQL explain e 操作员