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

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

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 中的日期时间值

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

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

Neptune 对特殊浮点值的处理

Neptune 按如下方式处理 SPARQL 中的特殊浮点值。

Neptune 中的 SPARQL NaN 处理

在 Neptune 中,SPARQL 可以接受查询NaN中的值。信号值和静默NaN值之间没有区别。Neptune 将所有NaN价值观视为安静。

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

但是,XSD 规范确实将两个xsd:double或两个xsd:floatNaN值视为相等。对于IN过滤器、过滤器表达式中的等号运算符以及精确匹配语义(在三元模式的对象位置NaN中具有 a),Neptune 都遵循此方法。

Neptune 中的 SPARQL 无限值处理

在 Neptune 中,SPARQL 可以在查询-INF中接受INF或的值。 INF比较结果大于任何其他数值,-INF比较结果小于任何其他数值。

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

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

Neptune 中的 SPARQL 负零处理

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

Neptune 对任意长度值的限制

Neptune 将 SPARQL 中 XSD 整数、浮点和十进制值的存储大小限制为 64 位。使用较大的值会导致InvalidNumericDataException错误。

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(含)。超出此范围的任何值都被视为无效。

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

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

SPARQL 1.1 规范以-运算符-、numeric-运算符-numericstring-运算literal符-literal 等形式定义范围运算符。stringNeptune 无法执行诸如invalid-literal -operator-之类的范围比较运算符numeric-value