使用ASK WHERE的Sparql查询基于COUNT结果

时间:2013-11-07 01:49:09

标签: count subquery sparql

我有以下基本查询,它可以检索艺术家完成了多少幅画作

PREFIX dc: <http://purl.org/dc/terms/>  
SELECT (COUNT(?numberOfPaintings) AS ?howMany)  
WHERE  {  ?numberOfPaintings dc:creator "Artists_Name" . }

变量?howMany返回,比方说20(绘画) - 到目前为止,非常好。我想创建另一个查询,使用ASK WHERE检查艺术家是否绘制了超过10幅绘画,预期结果为truefalse

我尝试在查询的?numberOfPaintings > 10部分使用ASK,我知道我仍然需要执行COUNT,但到目前为止我只看到> FILTER函数的上下文中的}运算符,所以我不确定如何在其他情况下使用它。

2 个答案:

答案 0 :(得分:4)

另一种选择,具有相同的效果:HAVING是在聚合操作后应用过滤器的方法:

PREFIX dc: <http://purl.org/dc/terms/>  
SELECT (COUNT(?numberOfPaintings) AS ?howMany)  
WHERE  {  ?numberOfPaintings dc:creator "Artists_Name" . }
HAVING ( ?howMany > 7 )

然后您可以嵌入ASK查询。

答案 1 :(得分:3)

  

注意:AndyS's answer更适合此特定情况。虽然我在此处使用的嵌套select查询和过滤器表达式对于更复杂的查询限制可能是必需的,但使用having可以更轻松地解决此特定情况。

让我们说你有这样的数据:

@prefix : <https://stackoverflow.com/questions/19826515/> .

:a1 :p :b1, :b2, :b3 .
:a2 :p :b1, :b2, :b3, :b4 .
:a3 :p :b1, :b2, :b3, :b4, :b5 .

然后查询如下:

select ?a (count(?b) as ?num) where {
  ?a :p ?b 
}
group by ?a

返回每个?a及其?b的数量:

-------------
| a   | num |
=============
| :a3 | 5   |
| :a1 | 3   |
| :a2 | 4   |
-------------

现在您只需将该查询包装在另一个查询中并过滤?num > ...。例如,。 3

prefix : <https://stackoverflow.com/questions/19826515/>
ask where { 
  {
    select ?a (count(?b) as ?num) where {
      ?a :p ?b 
    }
    group by ?a
  }
  filter( ?num > 3 )
}
Yes

对于7,我们会得到否:

prefix : <https://stackoverflow.com/questions/19826515/>
ask where { 
  {
    select ?a (count(?b) as ?num) where {
      ?a :p ?b 
    }
    group by ?a
  }
  filter( ?num > 7 )
}
No