SPARQL亚马逊 Neptune 中的标准合规性 - Amazon Neptune

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

SPARQL亚马逊 Neptune 中的标准合规性

在列出适用SPARQL标准之后,以下各节提供了有关Neptune的SPARQL实施如何扩展或偏离这些标准的具体细节。

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

适用标准 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 将始终考虑数据库实例中的所有三元组。例如,以下查询返回来自 Nept SPARQL une 端点的所有三元组:

SELECT * WHERE { ?s ?p ?o }

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

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

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

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

使用基于三元组的格式发出 Neptune Load 请求时,可使用 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 的默认命名图形。

SPARQLXPathNeptune 支持的构造函数

该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

查询和更新的默认基础 IRI

由于 Neptune 集群有多个不同的终端节点,因此使用查询或更新请求URL作为基础IRI可能会在解析相对值时导致意想不到的结果。IRIs

引擎版本 1.2.1.0 开始,IRI如果请求中没有明确的基础,Neptun IRI e 将使用http://aws.amazon.com/neptune/default/作为基础。

在以下请求中,基础IRI是请求的一部分:

BASE <http://example.org/default/> INSERT DATA { <node1> <id> "n1" } BASE <http://example.org/default/> SELECT * { <node1> ?p ?o }

结果将是:

?p ?o http://example.org/default/id n1

但是,在此请求中,IRI不包括基础:

INSERT DATA { <node1> <id> "n1" } SELECT * { <node1> ?p ?o }

在这种情况下,结果将是:

?p ?o http://aws.amazon.com/neptune/default/id n1

xsd:Neptune 中的dateTime 值

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

这也意味着,如果您输入指定特定时区的dateTime值,Neptune 会将该值转换为UTC并丢弃该时区信息。然后,当你稍后检索该dateTime值时,它是用原始时区的时间表示的UTC,而不是用原始时区的时间来表示,而且你无法再分辨出那个原始时区是什么样子。

Neptune 的特殊浮点值处理

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

SPARQL在 Neptune 中处理 NaN

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

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

但是,该XSD规范确实将两个xsd:doublexsd:floatNaN值视为相等。对于 IN 筛选条件、筛选表达式中的等于运算符以及完全匹配语义(在三元模式的对象位置具有 NaN),Neptune 遵循此规则。

SPARQLNeptune 中的无限值处理

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

两个带有匹配符号的INF值在比较时彼此相等,无论其类型如何(例如,浮点数-INF比较等于双精度-INF)。

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

SPARQLNeptune 中的负零处理

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

Neptune 的任意长度值限制

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

Neptune 扩展了 Equals 的比较功能 SPARQL

该SPARQL标准为值表达式定义了三元逻辑,其中值表达式的计算结果可以为truefalse、或。error术语相等(在 SPARQL1.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 中处理 Out-of-Range文字 SPARQL

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

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

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

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