1

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

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

变量?howMany返回,假设是 20(绘画)——到目前为止,非常好。我想创建另一个查询,ASK WHERE用于检查艺术家是否画了超过 10 幅画,预期结果为trueor false

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

4

2 回答 2

4

另一种效果大致相同:HAVING是在聚合操作后应用过滤器的方法:

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

然后您可以嵌入ASK查询中。

于 2013-11-07T10:19:27.733 回答
3

注意:对于这种特定情况, AndyS 的答案更好。虽然我在这里使用的嵌套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及其?bs 的数量:

-------------
| 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
于 2013-11-07T02:30:20.697 回答