2016-10-21 21 views
1

我想弄清楚Jena TDB如何处理物理查询计划级别上的多个FROM子句的SPARQL查询。 我想知道Jena TDB如何处理通过不同图表执行查询。Jena TDB物理查询计划与多个FROM子句

我做了一些小实验,看了看查询代数,但是,我不清楚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))))) 

当我执行查询过数据我收到预期的结果。

回答

0

FROM(和FROM NAMED)实际上并不是查询的一部分,但是指示要查询的数据集应该是什么。这些子句不会改变查询的功能,只会影响查询的操作,所以在代数中看不到它们。

与信息做什么特定的处理器变化:

  • 一些处理器将建立请求的数据集(甚至下载数据)
  • 但也常见到的API明确提供的数据集(例如query(query_string, dataset) ),在这种情况下,处理器将会忽略它,因为已经提供了一个数据集。
  • 数据集也可能在SPARQL protocol request中提供,在这种情况下,与API调用一样,处理器将忽略NAMED子句。

现在TDB数据库是一个数据集,但TDB有一个名为'dynamic datasets'一个特殊的功能,使用FROMFROM NAMED形成实际上是一个子集,限制查询,以在FROM条款提到的那些图表。

+0

在我上面介绍的情况下,数据集需要在某个时间点合并,以便查询得到回答。如果查询在图A和图B上执行,则查询不会生成答案。我想知道具体如何工作。 –

+1

啊哈! TDB有一个特殊功能:[动态数据集](https://jena.apache.org/documentation/tdb/dynamic_datasets.html),这就是您的查询工作的原因。 – user205512

+0

我明白了,你碰巧知道动态数据集何时构建?在查询被回答之前或查询计划中的每个“叶子”是否完成一次?我上面的例子是为了简单地展示这个问题,如果我的意思不清楚,那么我会发布一个新问题来解释一个例子的问题。 –