本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 SPARQL 的 Neptune 最佳实践
当您将 SPARQL 查询语言与 Neptune 一起使用时,请遵循以下最佳实践。有关在 Neptune 中使用 SPARQL 的信息,请参阅使用以下方式访问海王星图 SPARQL。
默认查询所有命名图形
Amazon Neptune 将每个三元组与一个命名图形相关联。默认图形定义为所有命名图形的并集。
如果提交 SPARQL 查询而未通过 GRAPH
关键字或 FROM NAMED
之类的构造明确指定图形,Neptune 将始终考虑数据库实例中的所有三元组。例如,以下查询从 Neptune SPARQL 端点返回所有三元组:
SELECT * WHERE { ?s ?p ?o }
显示在多个图形中的三元组将仅返回一次。
有关默认图形规范的信息,请参阅 SPARQL 1.1 查询语言规范的 RDF 数据集
为加载指定命名图形
Amazon Neptune 将每个三元组与一个命名图形相关联。如果加载、插入或更新三元组时未指定命名图形,Neptune 使用 URI http://aws.amazon.com/neptune/vocab/v01/DefaultNamedGraph
定义的回退命名图形。
如果您使用的是 Neptune 批量加载程序,则可以使用 parserConfiguration: namedGraphUri
参数指定要用于所有三元组(或第四个位置空白的四元组)的命名图形。有关 Neptune 加载程序 Load
命令语法的信息,请参阅Neptune 加载程序命令。
在查询的 FILTER、FILTER...IN 和 VALUES 之间进行选择
有三种方法在 SPARQL 查询中注入值:FILTER
、FILTER...IN
和 VALUES
。
例如,假设您要在单个查询内查找多个人员的好友。您可以使用 FILTER
构建查询,如下所示:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. FILTER (?s = ex:person1 || ?s = ex:person2)}
这将返回图形中 ?s
绑定到 ex:person1
或 ex:person2
并且传出边缘标记为 foaf:knows
的所有三元组。
您也可以创建一个使用 FILTER...IN
的查询,该查询返回等同的结果:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. FILTER (?s IN (ex:person1, ex:person2))}
您也可以使用 VALUES
创建查询,在此例中也会返回等同结果:
PREFIX ex: <https://www.example.com/> PREFIX foaf : <http://xmlns.com/foaf/0.1/> SELECT ?s ?o WHERE {?s foaf:knows ?o. VALUES ?s {ex:person1 ex:person2}}
尽管在许多情况下,这些查询在语义上是等效的,但在某些情况下,两个 FILTER
变体不同于 VALUES
变体:
-
第一种情况是在您注入重复值时,例如将同一个人注入两次。在这种情况下,
VALUES
查询会在结果中包含重复项。您可通过将DISTINCT
添加到SELECT
子句来显式消除此类重复。但是,在某些情况下,您可能希望在查询结果中包含重复项用于冗余值注入。而
FILTER
和FILTER...IN
在相同值多次显示时仅提取该值一次。 -
第二种情况涉及
VALUES
始终执行完全匹配,而FILTER
在某些情况下可能会应用类型提升并执行模糊匹配。例如,当您在 values 子句中包含类似于
"2.0"^^xsd:float
的文本时,VALUES
查询与此文本完全匹配,包括文本值和数据类型。相比之下,
FILTER
会为这些数字文本生成模糊匹配。该匹配会包括值相同但数字数据类型(例如xsd:double
)不同的文本。注意
枚举字符串文本或 URI 时,
FILTER
与VALUES
的行为没有区别。
FILTER
与 VALUES
之间的区别会影响优化以及所造成的查询计算策略。除非您的用例需要模糊匹配,否则我们建议您使用 VALUES
,因为它会避免查找与类型转换相关的特殊情况。因此,VALUES
通常会生成更高效的查询,运行速度更快,而且成本更低。