本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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
的左侧,另一个则用于右侧。
有关运算符的更多信息,请参阅海王星操作员 SPARQL explain。