本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon Neptune 符合SPARQL 标准
Amazon Neptune 在实现 SPARQL 图形查询语言时遵循以下标准。
SPARQL 的适用标准
SPARQL 根据 2013 年 3 月 21 日发布的 W3C SPARQL 1.1 查询语言
建议定义。 SPARQL 更新协议和查询语言由 W3C SPARQL 1.1 更新
规范定义。 对于数字格式,SPARQL 遵循 W3C XML 架构定义语言 (XSD) 1.1 第 2 部分:数据类型
规范,该规范与 IEEE 754 规范(IEEE 754-2019-IEEE 浮点算术标准 )一致。 欲了解更多信息,另请参阅维基百科(IEEE 754 页面 )。但是, IEEE 754-1985
版本之后引入的功能不包括在该规范中。
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:float
NaN
值视为相等。对于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 标准定义了值表达式的三元逻辑,其中值表达式可求值为 true
、false
或 error
。术语相等的默认语义(在 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 语义定义每个数字类型及其值空间(integer
和 decimal
除外)。这些定义将每种类型限制为一个值范围。例如,xsd:byte
范围是从 -128 到 +127(含)。超出此范围的任何值都被视为无效。
如果您尝试在类型的值空间之外分配文字值(例如,如果您尝试将 anxsd:byte
设置为文字值为 999),Neptune 会按原样接受该 out-of-range 值,而不对其进行舍入或截断。但它不会将该值保留为数字值,因为给定的类型无法表示数字值。
也就是说,"999"^^xsd:byte
即使该值超出了定义的xsd:byte
值范围,Neptune 也会接受。但是,在数据库中保留该值后,它只能在三元模式的宾语位置用于完全匹配语义。无法对其执行范围过滤器,因为 out-of-range 字面值不被视为数值。
SPARQL 1.1 规范以-运算符-、numeric
-运算符-numeric
、string
-运算literal
符-literal
等形式定义范围string
Neptune 无法执行诸如invalid-literal
-operator-之类的范围比较运算符numeric-value
。