我试图弄清楚Jena TDB如何在物理查询计划级别上处理具有多个FROM
子句的SPARQL查询。我想知道Jena TDB如何处理在不同的图上执行查询。
我做了一些小实验,看了看查询代数,然而,我不清楚FROM
子句是如何影响代数的。看起来从子句在代数中被丢弃了。我期望代数是在图的并集上求值的,但是我想要确定。
我有以下四组:
<http://example.com/book2/> <http://example.com/price> "5"^^<http://www.w3.org/2001/XMLSchema#integer> <http://example.com/A> .
<http://example.com/book2/> <http://example.com/title> "Lord of the Rings" <http://example.com/B> .
和以下查询:
SELECT (AVG(?price) as ?total)
FROM <http://example.com/A>
FROM <http://example.com/B>
WHERE {
?book <http://example.com/price> ?price .
?book <http://example.com/title> ?title .
}
./tdbquery --loc test --query test.sparql --explain
查询代数如下:
INFO exec :: ALGEBRA
(project (?total)
(extend ((?total ?.0))
(group () ((?.0 (avg ?price)))
(bgp (triple ?book <http://example.com/price> ?price)))))
当我对数据执行查询时,我收到了预期的结果。
FROM
(和FROM NAMED
)实际上不是查询的一部分,而是要查询的数据集应该是什么的指示。这些子句不会改变查询要做什么,只会改变它的操作对象,所以你不会在代数中看到它们。
不同的处理器处理这些信息的方式不同:
- 一些处理器将构建请求的数据集(甚至下载数据)
- 但是在api中显式地提供数据集(例如
query(query_string, dataset)
)也很常见,在这种情况下处理器会忽略它,因为已经提供了数据集。 - 数据集也可能在SPARQL协议请求中提供,在这种情况下,与API调用一样,处理器将忽略
NAMED
子句。
现在TDB数据库是一个数据集,但是TDB有一个特殊的功能叫做"动态数据集",它使用FROM
和FROM NAMED
来形成一个子数据集,限制了查询的图形在FROM
子句中提到的。