2017-04-25 30 views
1

我想要獲得已完成3件或更多作品(在DBpedia中)的所有作者的列表。 http://dbpedia.org/sparql我想獲得所有作者已經超過3件作品的列表 - DBpedia Sparql

基本代碼

select (count(?work) as ?totalWork), ?author 
Where 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 

我得到每個作家作品的完成總量:

我的例子能上運行。但是,當我嘗試過濾僅顯示具有超過3件作品的作者列表時。我得到錯誤:

我試着HAVING關鍵字或使用FILTER關鍵字。

使用過濾器

select (count(?work) as ?tw), ?author 
Where 
{ 
    ?work dbo:author ?author. 
    FILTER (?work > 3). 
} 
GROUP BY ?author 

error: Virtuoso 22023 Error VECDT: SR066: Unsupported case in CONVERT (INTEGER -> IRI_ID) 

使用HAVING關鍵字

select (count(?work) as ?tw), ?author 
Where 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 
HAVING (?tw > 3) 

Virtuoso 37000 Error SP031: SPARQL compiler: Variable ?tw is used in the result set outside aggregate and not mentioned in GROUP BY clause 

回答

3

使用HAVING是正確的,但有一個limitation in SPARQL with indirectly referring to aggregates

這一個工程:

SELECT (count(?work) as ?tw) ?author 
WHERE 
{ 
    ?work dbo:author ?author. 
} 
GROUP BY ?author 
HAVING (count(?work) > 3) 
+0

@TallTed感謝您的參考,我不知道這一點。不幸的是,它不會在http://sparql.org/query-validator.html上引發錯誤。我會和那裏的維護人員交談。 – AKSW

1

HAVING (?tw > 3)是正確的SPARQL。 HAVING由於SELECT歸因於作業後的過濾器,因此?tw是可見的,並且在投影之前。

(prefix ((dbo: <http://purl.org/dc/elements/1.1/>)) 
    (project (?tw ?author) 
     (filter (> ?tw 3) 
     (extend ((?tw ?.0)) 
      (group (?author) ((?.0 (count ?work))) 
      (bgp (triple ?work dbo:author ?author))))))) 

其中?.0count分配。

+0

我試圖運行這個,但它給出了一個錯誤,我想看看結果並理解代碼。有人可以解決這個問題:Virtuoso 37000錯誤SP030:SPARQL編譯器,第0行:在'?'的SPARQL表達式中COUNT關鍵字後只允許'('和DISTINCT –

+0

您在這裏所說的內容似乎與規範直接相關 - [「請注意,由於評估HAVING子句的邏輯位置,SELECT子句投射的表達式對HAVING子句不可見。」](https://www.w3.org/TR/sparql11-query /#sparqlHavingClause) – TallTed

+0

@MurlidharFichadia,它是SPARQL代數,而不是SPARQL。 –