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
),这实际上取决于本体。