SPARQL规范提到FROM
子句可以用于指定数据集。
SPARQL查询可以通过使用
FROM
子句和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
因此,从规范文件中,我原则上理解
- 指定了4个数据集,并且(我认为(
- 定义了一个"RDF数据集">
但是。如果我省略了FROM
和FROM 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
吗?
问题:
- 为什么
RDF dataset
与常规数据集的识别不同(FROM
与FROM NAMED
( - 前缀的URI实际上在
FROM
语句中被重用。前缀和FROM
子句之间有什么区别
这个问题-在SPARQL查询中指定数据集-展示了如何指定数据集,但没有解释这在SPARQL询问的上下文中以及在SPARQL质询被解析为实际数据的上下文中意味着什么。
这个问题——SPARQL查询中的FROM子句——提到了一个没有FROM子句的SPARQL查询是针对默认数据集执行的。但是,为什么省略所有数据集仍然会导致查询返回数据呢?
将SPARQL查询的执行与SQL查询进行比较有点棘手。SPARQL级别更高。
数据集
端点(例如,像Virtuoso、GraphDB这样的数据库(有一些实现SPARQL概念的自由。
数据集就是这样一个概念。通常,图形数据库允许您创建存储库,该存储库相当于SQL世界中的数据库。存储在这个三元组内部,这些三元组可以分组在命名图中。GRAPH
构造可帮助您选择要查找的集合。
存储库是您所指的数据集。
很少有数据库支持查询不在同一数据库中托管的数据集/存储库。原因很明显。
SPARQL
您的查询越不精确,匹配的数据就越多。使用GRAPH <...> {}
可以缩小集以匹配一些三元组,而无需指定完整的子查询
不要将数据集与命名空间混淆。RDF世界中的ID总是URI。URI的第一部分通常提到发明ID的组织。但它们仍然只是ID。使用前缀会使ID看起来更短。
您可以将每个三元组放在一个单独的图中,这将把图的名称变成三元组的标识符。这不是故意的,但也不是禁止使用。
SPARQL端点有一个要查询的数据集。如果您不做任何其他操作,那么查询将针对您将查询发送到的任何端点执行,该端点将作为其RDF数据集。
这就是OP查询返回结果的原因。端点已具有要查询的RDF数据集。
一些(少数,而不是所有(端点允许查询使用FROM
和FROM NAMED
更改查询的RDF数据集。这两个子句描述了所需的RDF数据集。URI可能指的是网络上的图,也可能指默认数据集中的图,具体取决于实现(根据我的经验,默认数据集中的图更常见(。
用于查询的SPARQL协议也是可选的default-graph-uri
和named-graph-uri
参数,其功能类似于FROM
或FROM NAMED
。同样,并非所有端点都尊重这些参数。
在查询执行期间访问命名图的正确方法是使用GRAPH
,而不是FROM
。