2016-03-24 65 views
1

我爲分組結果做了sparql查詢,並通過SPARQL端點http://glam.iptime.org/sparql執行查詢。爲什麼我的sparql查詢得不到結果?

但是,我沒有結果,也沒有錯誤消息。

查詢如下所示。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?age ?typeName (count(?s) as ?cnt) 
WHERE { 
{ 
select * where { 
?s rdf:type cfo:CulturalObject. 
?s rdfs:label ?label. 
?s cfo:temporal ?time. 
?time cfo:begin ?begin.  

BIND (STRDT(replace(?begin, 'BC', '-'), xsd:float) as ?year). 
BIND(IF(?year > 1897, "modern", IF(?year > 1392, "chosun", IF(?year > 918, "goryeo", IF(?year > 700, "north_south", IF(?year > -58, "three_states", "ancient"))))) as ?age). 

?s dc:type ?type. 
?type rdfs:label ?typeName. 
} 
} 
FILTER(BOUND(?age)). 
} 
GROUP BY ?age ?typeName 
LIMIT 100 

我的sparql查詢有問題嗎? 它有什麼問題?

我認爲sparql查詢聲明的順序是錯誤的。 有沒有其他意見?

+0

沒有任何人可以分辨出您正在查詢的數據。可能是SPARQL完全有效,但數據不匹配。一些提示:查看COALESCE而不是多個IF和子選擇幾乎總是一個錯誤,除非使用子選擇來計算聚集。 – scotthenninger

+2

另外,不清楚「查詢聲明順序爲假」是什麼意思。 SPARQL是一種聲明性語言,因此查詢子句的順序對結果沒有影響。排序可能會影響查詢效率,但這是一個不同的主題。 – scotthenninger

回答

6

而不是爲你做工作,並用你的查詢擊中端點,我想告訴你如何解決這個問題。基本上迂迴建立查詢。從一個三重模式開始。執行查詢 - LIMIT是你的朋友在這裏。然後添加下一個三重模式。隨時測試結果。

所以第一個查詢,簡直是:

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
} LIMIT 100 

執行的是,檢查它得到的結果。下一個查詢是:

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
    ?s rdfs:label ?label. 
} LIMIT 100 

假設這失敗 - 你得不到結果。所以也許他們用skos:prefLabel來代替。 SPARQL是一個非常試探性的語言,所以你可以嘗試以下方法:

SELECT * 
WHERE { 
    ?s a cfo:CulturalObject. 
    ?s ?p ?o 
} LIMIT 100 

檢查看?p?o值數據的實際結構。增加LIMIT以查看更多。使用結果構建下一個三重模式。最後,所有這些都是關於探索數據,與OWL或類似的查詢語言不同,您幾乎不需要知道數據就可以執行成功的查詢。其實,只要你知道,下面的查詢將總是產生的結果,除非數據存儲爲空:

SELECT ?s ?p ?o 
WHERE { 
    ?s ?p ?o . 
} LIMIT 1000 

正如評論所說,子選擇幾乎總是錯誤的,除非子選擇是計算總量。這是一個我看到很多的SPARQL反模式,我只能假設那裏有一些使用子選擇不當的例子。只是要注意的事情。

2

數據中的某些年份包括一些似乎破壞事物的字符。一種解決方法,如果你想排除有一個空行?age,是過濾掉含有此類字符的值用正則表達式,像這樣:FILTER(REGEX(?begin, "^(BC)?[0-9]+$"))

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?age ?typeName (count(?s) as ?cnt) WHERE { 
    ?s rdf:type cfo:CulturalObject. 
    ?s rdfs:label ?label. 
    ?s cfo:temporal ?time. 
    ?time cfo:begin ?begin. 
    # Filter the dates 
    FILTER(REGEX(?begin, "^(BC)?[0-9]+$")) 
    ?s dc:type ?type. 
    ?type rdfs:label ?typeName. 
    BIND (STRDT(replace(?begin, 'BC ', '-'), xsd:integer) as ?year). 
    BIND(IF(?year > 1897,"modern", 
      IF(?year > 1392, "chosun", 
       IF(?year > 918, "goryeo", 
       IF(?year > 700, "north_south", 
        IF(?year > -58, "three_states", 
         "ancient"))))) as ?age) 
} 
GROUP BY ?age ?typeName 
LIMIT 100 

你不需要子查詢你有你的查詢。

以下查詢獲取包含非單詞字符(包括有問題的字符)的所有cfo:begin值。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX cfo: <http://lod.culture.go.kr/ontology/> 

SELECT ?begin (count(?s) as ?cnt) WHERE 
{ 
    ?s cfo:temporal ?time. 
    ?time cfo:begin ?begin. 
    FILTER(REGEX(?begin, "\\W")) 
} 
GROUP BY ?begin 
LIMIT 100 

順便說一句,我建議YASGUI爲嘗試查詢,如果你不熟悉它。

相關問題