1

我试图弄清楚 Jena TDB 如何FROM在物理查询计划级别处理带有多个子句的 SPARQL 查询。我想知道 Jena TDB 如何处理对不同图形的查询。

我做了一些小实验并查看了查询代数,但是,我不清楚这些FROM子句如何影响代数。看起来 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)))))

当我对数据执行查询时,我收到了预期的结果。

4

1 回答 1

0

FROM(and FROM NAMED) 并不是真正的查询的一部分,而是指示要查询的数据集应该是什么。这些子句不会改变查询将做什么,只会改变它的操作,所以你在代数中看不到它们。

特定处理器对该信息的处理方式各不相同:

  • 一些处理器将构建请求的数据集(甚至下载数据)
  • 但是在 API 中显式提供数据集(例如query(query_string, dataset))也很常见,在这种情况下,处理器将忽略它,因为已经提供了数据集。
  • 数据集也可能在SPARQL 协议请求中提供,在这种情况下,与 API 调用一样,处理器将忽略该NAMED子句。

现在 TDB 数据库是一个数据集,但是 TDB 有一个特殊的功能,称为“动态数据集”,它实际上使用FROMFROM NAMED形成一个子数据集,将查询的图限制为FROM子句中提到的那些。

于 2016-10-21T11:24:47.200 回答