带有多个FROM子句的Jena TDB物理查询计划



我试图弄清楚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有一个特殊的功能叫做"动态数据集",它使用FROMFROM NAMED来形成一个子数据集,限制了查询的图形在FROM子句中提到的。

相关内容

  • 没有找到相关文章

最新更新