SPARQL平均实例数
有没有办法找到每个类的平均、最小和最大实例数?我发现:SPARQL平均实例数,sparql,average,Sparql,Average,有没有办法找到每个类的平均、最小和最大实例数?我发现: SELECT (count(?instance) as ?no) WHERE { ?instance a ?class . } group by ?class order by desc(?no) 你就快到了 当前查询返回每个类的实例数,例如 +-------+ | no | +-------+ | 33054 | | 64239 | | 28675 | +-------+ 现在,你要做的是计算这个中间结果的聚合
SELECT (count(?instance) as ?no)
WHERE {
?instance a ?class .
}
group by ?class
order by desc(?no)
你就快到了
当前查询返回每个类的实例数,例如
+-------+
| no |
+-------+
| 33054 |
| 64239 |
| 28675 |
+-------+
现在,你要做的是计算这个中间结果的聚合。
幸运的是,SPARQL 1.1允许子查询,即我们可以在另一个查询中直接重用您的查询结果,只需使用相应的聚合函数:
SELECT (AVG(?no) AS ?avg)
(MIN(?no) AS ?min)
(MAX(?no) AS ?max)
WHERE {
SELECT (COUNT(?instance) AS ?no)
WHERE { ?instance rdf:type ?class }
GROUP BY ?class
}
输出:
+-----------------------+-------+-------+
| avg | min | max |
+-----------------------+-------+-------+
| 41989.333333333333333 | 28675 | 64239 |
+-----------------------+-------+-------+
注意,我删除了按排序的
,因为它不会影响此处的最终结果。此外,您可以看到没有必要使用groupby
,因为我们正在计算唯一现有列上的聚合。子选择查询:SELECT(AVG(?o)as?AVG)(MIN(?no)as?MIN)(MAX(?no)as?MAX),其中{SELECT(COUNT(?instance)as?no)WHERE{instance rdf:type?class}groupby?class}
AKSW,谢谢!总之,不需要另一个groupby
的原因是,如果没有groupby
子句,那么所有结果都有一个默认组()@iMBLISH,为了更好地理解,您可以在查询中添加类似于groupby?foobar
的内容。此外,您不计算“空”类(如果它们存在),这可能会影响?avg
的值。好的,对于空类,您需要存在一些模式三元组,如?a类owl:class.
或任何其他类公理(例如rdfs:Subassof
),这实际上取决于本体。