Types SPARQL:如何列出和统计RDF数据集中的每种数据类型?
我试图统计数据集中每个数据类型的实例。它是一个简单的数据集,只有三种数据类型:integer、string和dateTime 我可以通过查询得到数据类型的数量(3):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.
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背景。