使用 SPARQL 的 Neptune 最佳实践 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

使用 SPARQL 的 Neptune 最佳实践

当您将 SPARQL 查询语言与 Neptune 一起使用时,请遵循以下最佳实践。有关在 Neptune 中使用 SPARQL 的信息,请参阅使用 SPARQL 访问 Neptune 图

默认查询所有命名图形

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 查询中注入值:  FILTERFILTER...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:person1ex: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 子句来显式消除此类重复。但是,在某些情况下,您可能希望在查询结果中包含重复项用于冗余值注入。

    FILTERFILTER...IN 在相同值多次显示时仅提取该值一次。

  • 第二种情况涉及 VALUES 始终执行完全匹配,而 FILTER 在某些情况下可能会应用类型提升并执行模糊匹配。

    例如,当您在 values 子句中包含类似于 "2.0"^^xsd:float 的文本时,VALUES 查询与此文本完全匹配,包括文本值和数据类型。

    相比之下,FILTER 会为这些数字文本生成模糊匹配。该匹配会包括值相同但数字数据类型(例如 xsd:double)不同的文本。

    注意

    枚举字符串文本或 URI 时,FILTERVALUES 的行为没有区别。

FILTERVALUES 之间的区别会影响优化以及所造成的查询计算策略。除非您的用例需要模糊匹配,否则我们建议您使用 VALUES,因为它会避免查找与类型转换相关的特殊情况。因此,VALUES 通常会生成更高效的查询,运行速度更快,而且成本更低。