2015-06-22 57 views
2

我正在計數數據集中每個數據類型的實例。這是一個簡單的數據集,只有三種數據類型:整數,字符串和日期時間。SPARQL:如何列出和計算RDF數據集中的每個數據類型?

我可以通過查詢得到的數據類型(3)數量:

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

結果像這樣: -------------- | dTypeCount | ============== | 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  | 
------------------------------------------------------------- 

我試圖子查詢,工會,多個組的各種組合的約束變量並且要麼沒有得到期望的結果 或在SELECT中出現「非組鍵變量:」錯誤。感謝所有的幫助。

回答

0

由於您已經按?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 
+0

謝謝喬舒亞,你的解決方案的第二個執行速度最快的三個,所以我會去用它。 – Hilary

+0

@Hilary由於(取決於查詢引擎如何實現)更少的函數調用(例如,只有一個數據類型調用而不是兩個調用),第二個可能會更快,因此速度更快並不是一個巨大的驚喜。 (但是我沒有事先計算它們) –

+0

很高興知道,謝謝Joshua。每天仍在學習。欣賞迴應。 – Hilary

1

你幾乎已經擁有了它。

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

正如你已經按數據類型分組,你只需要一個組函數來引用它。

+0

謝謝克里斯,這是一種享受。 – Hilary

+0

爲什麼'MAX(?datatype)AS?dtype'?這意味着在一堆價值中應該是相同的排序。 '樣本'可能更適合作爲一項綜合功能。即,。 'select(count(?o)as?dTypeCount)(sample(?datatype)as?dtype){...}'。而且你已經將數據類型(?o)綁定爲?數據類型,你可以'group by?datatype',這可能會避免額外的函數調用。 –

+0

你是對的,你的方式可能更有效率。 MAX而不是樣本可能只是我的SQL背景。 – chrisis

相關問題