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

Types SPARQL:如何列出和统计RDF数据集中的每种数据类型?,types,count,sparql,Types,Count,Sparql,我试图统计数据集中每个数据类型的实例。它是一个简单的数据集,只有三种数据类型:integer、string和dateTime 我可以通过查询得到数据类型的数量(3): SELECT (COUNT(DISTINCT datatype(?o)) AS ?dTypeCount) {?s ?p ?o. FILTER (isLiteral(?o)) } GROUP BY ?dTypeCount SELECT DISTINCT (datatype(?o) AS ?dType) {?s ?p ?o.

我试图统计数据集中每个数据类型的实例。它是一个简单的数据集,只有三种数据类型:integer、string和dateTime

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

SELECT (COUNT(DISTINCT datatype(?o)) 
AS ?dTypeCount) {?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY ?dTypeCount
SELECT DISTINCT (datatype(?o) AS ?dType) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 
SELECT (COUNT(?o) AS ?dTypeCount) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY datatype(?o)
结果如下: -------------- |数据类型计数| ============== | 3 | --------------

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

SELECT (COUNT(DISTINCT datatype(?o)) 
AS ?dTypeCount) {?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY ?dTypeCount
SELECT DISTINCT (datatype(?o) AS ?dType) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 
SELECT (COUNT(?o) AS ?dTypeCount) 
{?s ?p ?o. FILTER (isLiteral(?o)) } 
GROUP BY datatype(?o)
结果如下:

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

-----------------------------------------------
| dType                                       |
===============================================
| <http://www.w3.org/2001/XMLSchema#dateTime> |
| <http://www.w3.org/2001/XMLSchema#string>   |
| <http://www.w3.org/2001/XMLSchema#integer>  |
-----------------------------------------------
--------------
| 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     |
-------------------------------------------------------------
-------------------------------------------------------------
|数据类型| |数据类型计数|
=============================================================
|  || 23494      |
|    || 93548      |
|   || 228942     |
-------------------------------------------------------------
我尝试过子查询、联合、多组绑定变量的各种组合,但都没有得到理想的结果
或者在SELECT:“错误中获取“非组键变量”。感谢所有帮助。

由于您已按?o的数据类型分组,因此您知道组中的所有?o值都具有相同的数据类型。您可以对其进行采样,以获取其中一个值,然后获取其数据类型:

选择(数据类型(样本(?o))作为数据类型)
(计数(?o)为?数据类型计数)
在哪里{
?s?p?o
过滤器是独立的(?o)
} 
按数据类型分组(?o)
如果您不喜欢有这么多复杂的表达式,可以绑定查询中的数据类型:

选择数据类型(计数(?o)作为数据类型计数)
在哪里{
?s?p?o
过滤器是独立的(?o)
绑定(数据类型(?o)为?数据类型)
} 
分组依据?数据类型
你差点就成功了

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

由于您已经按数据类型分组,您只需要一个group函数来引用它。

谢谢Joshua,您的第二个解决方案在所有三个解决方案中执行得最快,因此我将使用它。@Hilary第二个可能更快,因为(取决于查询引擎的实现方式)对函数的调用更少(例如,只有一个数据类型调用,而不是两个),因此速度更快并不令人惊讶。(但我也没有事先计算时间。)很高兴知道,谢谢Joshua。每天都在学习。感谢您的回复。为什么
MAX(?datatype)AS?dtype
?这意味着一组应该相同的值之间的顺序。
sample
可能更适合作为聚合函数。例如,
选择(count(?o)AS?dTypeCount)(sample(?datatype)AS?dtype){…}
,因为您已经绑定了数据类型(?o)作为?数据类型,您可以
按?数据类型分组
,这可能会避免额外的函数调用。您是对的,您的方式可能更高效。MAX而不是sample可能只是我的SQL背景。