我是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 )