SPARQL:如何列出和计算 RDF 数据集中的每种数据类型?

SPARQL: How do I List and count each data type in an RDF dataset?

我正在尝试计算数据集中每种数据类型的实例。这是一个简单的数据集,只有三种数据类型:整数、字符串和日期时间。

我可以通过查询得到数据类型的数量(3):

SELECT (COUNT(DISTINCT datatype(?o)) 
AS ?dTypeCount) {?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY ?dTypeCount

结果如下: -------------- | dType计数 | ============== | 3 | --------------

我可以通过查询获得数据类型(字符串、整数、日期时间)的列表:

SELECT DISTINCT (datatype(?o) AS ?dType) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 

结果如下:

-----------------------------------------------
| dType                                       |
===============================================
| <http://www.w3.org/2001/XMLSchema#dateTime> |
| <http://www.w3.org/2001/XMLSchema#string>   |
| <http://www.w3.org/2001/XMLSchema#integer>  |
-----------------------------------------------

我可以通过查询获得每种数据类型的计数:

SELECT (COUNT(?o) AS ?dTypeCount) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY datatype(?o)

结果如下:

--------------
| dTypeCount |
==============
| 23494      |
| 93548      |
| 228942     |
--------------

但我无法在计数旁边显示数据类型的名称,即看起来像这样:

-------------------------------------------------------------
| dType                                       || dTypeCount |
=============================================================
| <http://www.w3.org/2001/XMLSchema#dateTime> || 23494      |
| <http://www.w3.org/2001/XMLSchema#string>   || 93548      |
| <http://www.w3.org/2001/XMLSchema#integer>  || 228942     |
-------------------------------------------------------------

我已经尝试了子查询、联合、多个 GROUP BY 绑定变量的各种组合,但都没有得到想要的结果 或出现 "Non-group key variable in SELECT: " 错误。非常感谢所有帮助。

由于您已按 ?o 的数据类型分组,因此您知道组中的所有 ?o 值都具有相同的数据类型。您可以只 采样 来获取这些值之一,然后获取它的数据类型:

select (datatype(sample(?o)) as ?datatype)
       (count(?o) AS ?dTypeCount)
where {
  ?s ?p ?o
  filter isLiteral(?o)
} 
group by datatype(?o)

如果您不喜欢周围有太多复杂的表达式,您可以绑定查询中的数据类型:

select ?datatype (count(?o) AS ?dTypeCount)
where {
  ?s ?p ?o
  filter isLiteral(?o)
  bind (datatype(?o) as ?datatype)
} 
group by ?datatype

你几乎成功了。

SELECT (COUNT(?o) AS ?dTypeCount) (MAX(?datatype) AS ?dtype)
{?s ?p ?o. 
 BIND (datatype(?o) AS ?datatype) 
FILTER (isLiteral(?o)) } 
GROUP BY datatype(?o)

因为您已经按数据类型分组,所以您只需要一个分组函数来引用它。