2016-03-24 20 views
1

SPARQLエンドポイントhttp://glam.iptime.org/sparqlで結果をグループ化するための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クエリの宣言の順序はfalseだと思います。 他の意見はありますか?

+0

あなたが照会しているデータの意味がわからなくても、誰にでもわかることはできません。 SPARQLは完全に有効ですが、データに一致するものはありません。いくつかのヒント:複数のIFの代わりにCOALESCEを見てください。サブ選択が集計の計算に使用されていない限り、サブ選択はほとんどの場合間違いです。 – scotthenninger

+2

また、「クエリ宣言の順序が偽である」という意味が明確ではありません。 SPARQLは宣言型言語なので、問合せ句の順序は結果に影響しません。順序付けはクエリの効率に影響する可能性がありますが、それは別のトピックです。 – scotthenninger

答えて

6

あなたのために仕事をして、エンドポイントにヒットするのではなく、問題へのアプローチ方法を教えてください。基本的には、質問をpedantically構築してください。単一のトリプルパターンから始めます。クエリを実行します - LIMITはここにあなたの友人です。次に、次のトリプルパターンを追加します。結果を試してみてください。

だから、最初のクエリは、単純に次のようになります。

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

それは結果を取得することを確認し、それを実行します。次のクエリは次のとおりです。

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

これは失敗します。結果は得られません。だから、彼らは代わりにskos:prefLabelを使ったかもしれない。

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

チェック?p?oの値は、データが実際に構成されているかを確認するために:あなたは、次の試みることができるので、SPARQLは、非常に探索言語です。 LIMITを少し増やしてください。結果を使用して次のトリプルパターンを作成します。

結局のところ、データの探索に関することであり、OWLや類似のクエリ言語とは異なり、クエリを成功させるためにデータをほとんど知る必要はありません。実際には、ちょうどあなたが知っているように、データストアが空でない場合、次のクエリは常に、結果が得られます:サブ選択でない限り

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

をコメントで述べたように、サブ選択ほとんど常に間違いです集約を計算する。それはSPARQLのアンチパターンです。私はたくさん見ています。サブセレクションを不適切に使用する例がいくつかあると仮定することしかできません。知っているだけのこと。

2

データの中には、いくつかの文字が含まれているものがあります。 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 

あなたは、サブクエリを必要としません:あなたは空の?ageを持つ行を除外したい場合はこれに対する一つの解決策は、そのように、正規表現で、このような文字を含む値をフィルタリングすることですあなたはあなたの質問にあります。

次のクエリは、単語以外の文字(問題のある文字を含む)をすべて含む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をお勧めします。