Sparql:根据数据属性值的条件获取个体的计数



我是sparql的新手,我想知道如何执行以下任务:

我的数据:

base url PREFIX fff:<...>
classes:
Artwork
Site
Category
object prop:
site hasArtwork Artwork 
site hasCategory Category
data prop:
Artwork kkk:conservationState xsd:string  (bad, good...)

我想知道拥有10件以上保存完好的艺术品的博物馆的数量。知道他们的名字也很酷,但我不知道这是否可能。

到目前为止,我只知道如何计算有多少网站的艺术作品处于不良状态

SELECT (COUNT(?site) AS ?count) WHERE {
?site a fff:Site;
fff:hasCategory fff:Museum;
fff:hasArtwork ?artwork;
?artwork pgt:conservationState "bad"^^xsd:string.
}

谢谢!

要输出博物馆的艺术品数量,将?site添加到SELECT中,计算艺术品数量,并将GROUP BY添加到站点组(这意味着每个站点将有一个结果):

SELECT ?site (COUNT(?artwork) AS ?artwork_count) 
WHERE {
?site a fff:Site ;
fff:hasCategory fff:Museum ;
fff:hasArtwork ?artwork .
?artwork pgt:conservationState "bad"^^xsd:string .
} 
GROUP BY ?site

如果您想输出关于每个博物馆的附加属性(例如,它的名称),您也必须将这些属性添加到GROUP BY

统计项属性

如果你想输出已计数艺术品的属性(例如,它们的名字),你可以在SELECT:

中使用GROUP_CONCAT
SELECT ?site (COUNT(?artwork) AS ?artwork_count) (GROUP_CONCAT(?artwork_name; SEPARATOR=", ") AS ?artwork_names)

所有的值将在同一列/单元格中,例如用逗号分隔。

按计数过滤

如果只输出?artwork_count大于10的博物馆,可以在GROUP BY后面加上HAVING:

HAVING( ?artwork_count > 10 )

最新更新