2

SPARQL 规范提到该子句FROM可用于指定数据集。

FROMSPARQL 查询可以通过使用子句和FROM NAMED描述 RDF 数据集的子句来指定要用于匹配的数据集。

SPARQL 上下文中的“数据集”是什么?我对一般数据库非常熟悉,并且我原则上理解,然后对数据集执行对以 SQL 等语言表达的数据的查询,以解析该数据集的某个子集。

我试图理解以下查询:

prefix cpmeta: <...some_domain>

select distinct
?uri
?label
?stationId

from <...some_domain>
from <...some_domain>
from <...some_domain>
from <...some_domain>
from named <...some_domain>

where {

    { ?uri rdfs:label ?label }

    UNION

    { ?uri cpmeta:hasName ?label }

    UNION 

    {
        graph <...some_domain> {
            ?uri a cpmeta:Station .
            ?uri cpmeta:hasName ?label .
        }
    }

    ?uri cpmeta:hasStationId ?stationId
}

limit 100

所以从规范文档中我原则上理解

  1. 指定了 4 个数据集,并且(我认为)
  2. 定义了一个“RDF 数据集”

然而。FROM如果我省略andFROM NAMED子句,查询实际上会执行(但结果略有不同) :

prefix cpmeta: <...some_domain>

select distinct
?uri
?label
?stationId

where {

    { ?uri rdfs:label ?label }

    UNION

    { ?uri cpmeta:hasName ?label }

    UNION 

    {
        graph <...some_domain> {
            ?uri a cpmeta:Station .
            ?uri cpmeta:hasName ?label .
        }
    }

    ?uri cpmeta:hasStationId ?stationId
}

limit 100

这么清楚???已经指定了一个数据集。是通过prefix?

问题:

  1. 为什么RDF dataset与常规数据集(FROMvs FROM NAMED)的标识不同
  2. 前缀的 URI 实际上在FROM语句中被重用。FROM前缀和子句有什么区别?

这个问题 -在 SPARQL 查询中指定数据集- 展示了如何指定数据集,但没有解释在 SPARQL 查询的上下文中以及在 SPARQL 查询被解析为实际数据的上下文中这意味着什么。

这个问题 - SPARQL 查询中的 FROM 子句 - 提到没有 FROM 子句的 SPARQL 查询是针对默认数据集执行的。但是,为什么省略所有数据集仍然会导致查询返回数据呢?

4

2 回答 2

1

RDF 数据集是图形的集合。它有一个默认的未命名图和零个或多个命名图。

SPARQL 端点有一个要查询的数据集。如果您不执行任何其他操作,则查询将针对您将查询发送到的任何端点作为其 RDF 数据集执行。

这就是 OP 查询返回结果的原因。端点已经有要查询的 RDF 数据集。

一些(少数,不是全部)端点允许查询使用FROM和更改查询的 RDF 数据集FROM NAMED。这两个子句描述了所需的 RDF 数据集。URI 可能会引用网络上的图形或默认数据集中的图形,具体取决于实现(根据我的经验,默认数据集中的图形更常见)。

用于查询的 SPARQL 协议也是可选的default-graph-urinamed-graph-uri功能类似于FROMor的参数FROM NAMED。同样,并非所有端点都尊重参数。

在查询执行期间访问命名图的正确方法是使用GRAPH,而不是FROM

于 2020-02-21T14:56:55.707 回答
1

比较 SPARQL 查询与 SQL 查询的执行有点棘手。SPARQL 更高级。

数据集

端点(例如,像 Virtuoso、GraphDB 这样的数据库)有一些自由(不)来实现 SPARQL 概念。

数据集就是这样一个概念。通常,图形数据库允许您创建相当于 SQL 世界中的数据库的存储库。在这个三元组内部存储,这些三元组可以分组在命名图中。该GRAPH构造可帮助您选择要查看的集合。

存储库是您所指的数据集。

很少有数据库支持查询不在同一数据库中的数据集/存储库。原因很明显。

SPARQL

您的查询越不精确,匹配的数据就越多。使用GRAPH <...> {}可以缩小集合以匹配一些三元组,而无需指定完整的子查询

不要将数据集与命名空间混淆。RDF 世界中的 ID 始终是一个 URI。URI 的第一部分通常提到发明 ID 的组织。但是,它们仍然只是 ID。使用前缀会使 ID 看起来更短。

您可以将每个三元组放在一个单独的图中,这会将图的名称转换为三元组的标识符。这不是故意的,但也不是禁止使用的。

于 2020-02-21T14:18:01.493 回答