Amazon Neptune 中的 SPARQL 标准合规性 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

Amazon Neptune 中的 SPARQL 标准合规性

Amazon Neptune 在实施 SPARQL 图形查询语言时,符合以下标准。

SPARQL 的适用标准

Neptune SPARQL 实施细节

以下各节提供了如何在 Neptune 中实施 SPARQL 的具体详细信息。

Neptune SPARQL 中的默认命名空间前缀

默认情况下定义了 Neptune 下前缀以用于 SPARQL 查询。有关更多信息,请参阅 SPARQL 规范中的前缀名称

  • rdf  – http://www.w3.org/1999/02/22-rdf-syntax-ns#

  • rdfs – http://www.w3.org/2000/01/rdf-schema#

  • owl  – http://www.w3.org/2002/07/owl#

  • xsd  – http://www.w3.org/2001/XMLSchema#

SPARQL 默认图形和命名图形

将每个三 Amazon Neptune 组与命名图形相关联。默认图形定义为所有命名图形的并集。

查询的默认图形

如果提交 SPARQL 查询而未通过 GRAPH 关键字或 FROM NAMED 之类的构造明确指定图形,Neptune 将始终考虑数据库实例中的所有三元组。例如,以下查询从 Neptune SPARQL 终端节点返回所有三元组:

SELECT * WHERE { ?s ?p ?o }

显示在多个图形中的三元组将仅返回一次。

有关默认图形规范的信息,请参阅 SPARQL 1.1 查询语言规范的 RDF 数据集一节。

为加载、插入或更新指定命名图形

如果加载、插入或更新三元组时未指定命名图形,Neptune 用 URI 定义的回退命名图形。http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph.

当你发行 NeptuneLoad使用基于三元组的格式的请求时,可使用parserConfiguration: namedGraphUri参数。有关 Load 命令语法的信息,请参阅Neptune 加载程序命令

重要

如果您不使用此参数,并且未指定命名图形,将使用回退 URI:http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph

如果通过 SPARQL UPDATE 加载三元组而未显式提供命名图形目标,也将使用此回退命名图形。

可使用基于四元组的 N-Quads 格式为数据库中的每个三元组指定一个命名图形。

注意

您可以使用 N-Quads 将命名图形保留为空。在本例中,将使用 http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph

使用 namedGraphUri 解析程序配置选项,可以覆盖 N-Quads 的默认命名图形。

Neptune 支持的 SPARQL XPath 构造函数

SPARQL 标准允许 SPARQL 引擎支持一组可扩展的 XPath 构造函数。Neptune 目前支持以下构造函数,其中xsd前缀定义为http://www.w3.org/2001/XMLSchema#

  • xsd:boolean

  • xsd:integer

  • xsd:double

  • xsd:float

  • xsd:decimal

  • xsd:long

  • xsd:unsignedLong

XSD: Neptune 中的 DateTime 值

出于性能考虑,Neptune 始终将日期/时间值存储为协调世界时 (UTC) 形式。这可让直接比较非常有效。

这也意味着如果你输入dateTimeNeptune 将将该值转换为 UTC 形式并丢弃该时区信息。当您稍后检索该 dateTime 值时,它会以 UTC 形式表示,而不是原始时区的时间,并且您再也无法确定原始时区。

Neptune 处理特殊浮点值

Neptune 所示处理 SPARQL 中的特殊浮点值。

Neptune 中的 SPARQL NaN 处理

在 Neptune 中,SPARQL 可以接受NaN在查询中。信号和安静之间没有区别NaN有效值。Neptune 对待所有NaN价值观一样安静。

从语义上讲,无法进行 NaN 比较,因为没有什么大于、小于或等于 NaN。这意味着比较一侧的 NaN 值理论上永远不会匹配另一侧的任何 内容。

但是,XSD 规范确实对待两个xsd:double要么xsd:float NaN值是相等的。Neptune 关注这个INfilter,对于过滤器表达式中的相等运算符,以及精确匹配语义(具有NaN在三重模式的对象位置)。

Neptune 中的 SPARQL 无限值处理

在 Neptune 中,SPARQL 可以接受INF要么-INF在查询中。INF比较大于任何其他数值,并且-INF比较小于任何其他数值。

不管值的类型如何,带匹配符号的两个 INF 值的比较结果是相等(例如,浮点 -INF 等于双精度 -INF)。

当然,无法进行 NaN 比较,因为没有什么内容大于、小于或等于 NaN

Neptune 中的 SPARQL 负零处理

Neptune 将负零值标准化为无符号零。您可以在查询中使用负零值,但它们不会原样记录在数据库中,并且在比较时与无符号零相等。

Neptune 对任意长度值的限制

Neptune 将 SPARQL 中的 XSD 整数、浮点数和十进制值的存储大小限制为 64 位。因此,系统可能会任意截断较大的值,产生意想不到的结果。

Neptune 在 SPARQL 中扩展了等于比较

SPARQL 标准定义了值表达式的三元逻辑,其中值表达式可求值为 truefalseerror。术语相等的默认语义,如中定义的SPARQL 1.1 规范),这适用于=!=在中比较FILTER条件,生成error比较中不明确可比的数据类型时运算符表在规范中。

此行为可能会导致不直观的结果,如以下示例所示。

数据:

<http://example.com/Server/1> <http://example.com/ip> "127.0.0.1"^^<http://example.com/datatype/IPAddress>

查询 1:

SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o = "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }

查询 2:

SELECT * WHERE { <http://example.com/Server/1> <http://example.com/ip> ?o . FILTER(?o != "127.0.0.2"^^<http://example.com/datatype/IPAddress>) }

使用 Neptune 在版本 1.0.2.1 之前使用的默认 SPARQL 语义,两个查询均返回空结果。原因是,?o = "127.0.0.2"^^<http://example.com/IPAddress> 在为 ?o := "127.0.0.1"^^<http://example.com/IPAddress> 评估时生成 error 而不是 false,因为没有为自定义数据类型 <http://example.com/IPAddress> 指定明确的比较规则。因此,第二个查询中的否定版本也会生成 error。在这两个查询中,error 会导致筛选掉候选解决方案。

从版本 1.0.2.1 开始,Neptune 根据规范,扩展了 SPARQL 不等于运算符。请参阅 SPARQL 1.1 关于运算符可扩展性的部分,该部分允许引擎定义如何对用户定义的数据类型和不可比较的内置数据类型进行比较的其他规则。

利用此选项,Neptune 现在对在运算符映射表中未明确定义的任意两种数据类型进行比较时,如果对在计算结果中,则视为:true如果文字值和数据类型在语法上相等,否则为 false。在任何情况下都不会产生 error

使用这些新语义,第二个查询将返回 "127.0.0.1"^^<http://example.com/IPAddress> 而不是空的结果。

处理 Neptune SPARQL 中超出范围的文字

XSD 语义定义每个数字类型及其值空间(integerdecimal 除外)。这些定义将每种类型限制为一个值范围。例如,xsd:byte 范围是从 -128 到 +127(含)。超出此范围的任何值都被视为无效。

如果您尝试在类型的值空间之外分配文字值(例如,如果您尝试设置xsd:byte字面值为 999),Neptune 接受out-of-range按原样值,不舍入或截断它。但它不会将该值保留为数字值,因为给定的类型无法表示数字值。

也就是说,Neptune 接受"999"^^xsd:byte尽管它是一个超出定义的值xsd:byte值范围。但是,在数据库中保留该值后,它只能在三元模式的宾语位置用于完全匹配语义。不能对其执行范围过滤器,因为out-of-range文字不会被视为数字值。

SPARQL 1.1 规范定义范围运算符在表单中numeric-运算符numericstring-运算符stringliteral-运算符literal,依此类推。Neptune 不能执行范围比较运算符invalid-literal-运算符numeric-value.