2016-08-17 10 views
2

私はdbo:birthDateの年がdbo:birthYearの値と異なる場合を比較するためにSPARQLクエリを作成:SPARQLで日付の値(xsd:date)を年と比較するにはどうすればいいですか?

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX dbo: <http://dbpedia.org/ontology/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

Select distinct ?s ?vv1 ?vv2 where 
    { ?s a dbo:Person ; dbo:birthDate ?v1 . 
    ?s dbo:birthYear ?v2 . 
    bind(year(xsd:date(?v1)) as ?vv1) . 
    bind(xsd:gYear(?v2) as ?vv2) . 
    filter(?vv1 != ?vv2) 
    } 

私は、次の答えを得た:

   S     vv1 vv2 
<http://example.com/resource/1> 1993 1993 
<http://example.com/resource/5> 1998 1993 
<http://example.com/resource/7> 1978 1978 
<http://example.com/resource/13> 1993 1993 

正しい答えが唯一の資源である5birthDateの年が1998birthYearの年が1993に等しい年です。答えは、vv1vv2は、" "のない年に値を持ち、明らかに両方とも同じタイプです。だから、私はSPARQLがなぜvv1vv2のレコードが1であるかと言った理由が分かりません。私はSPARQLの日付を比較する方法を探しましたが、私の質問は正しいと思います。

私は布石2.3.1私のインスタンスの

例として使用して、このクエリをテストした:

@prefix dbo: <http://dbpedia.org/ontology/> . 
@prefix :  <http://example.com/resource/> . 
@prefix dbp: <http://dbpedia.org/property/> . 
@prefix owl: <http://www.w3.org/2002/07/owl#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix xml: <http://www.w3.org/XML/1998/namespace> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix mu: <http://example.com/resource/> . 
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . 
@prefix foaf: <http://xmlns.com/foaf/0.1/> . 

mu:1 a    dbo:Actor , 
         dbo:Person , 
         dbo:MusicalArtist , 
         mu:MusicActor , 
         owl:NamedIndividual ; 
     dbo:birthDate "1993-03-11"^^xsd:date ; 
     dbo:birthYear "1993" ; 
     foaf:name  "John Joe"@en , 
         "Joe, John"@en . 

mu:5 a    <http://example.com/MusicActor> , 
         dbo:Actor , 
         dbo:Person , 
         mu:MusicActor , 
         owl:NamedIndividual ; 
     dbo:birthDate "1998-04-11" , 
         "1998-04-11"^^xsd:date ; 
     dbo:birthYear "1993" ; 
     foaf:name  "Barry Hannah"@en , 
         "Barry B. Hannah"@en . 

mu:7 a    dbo:Person , 
         dbo:MusicalArtist , 
         owl:NamedIndividual ; 
     dbo:birthDate "1978-05-11" , 
         "1978-05-11"@en ; 
     dbo:birthYear "1978" ; 
     foaf:name  "Helen Petty" , 
         "Helen Petty"@en . 

これはhappingいる理由誰もが、言うてくださいすることができますか?残念ながら、私は分かりません。どんな助けでも大歓迎です!

+0

私は 'vv1'と' vv2'が同じ型を持っていることを確信していません。実際、あなたの出力は、そうでないことを示唆しています。 – TallTed

答えて

5

SPARQL年()関数は、整数に?v2をキャストする必要があるので、整数を返します。

SPARQL DISTINCT ?s ?vv1 ?vv2 
WHERE { 
    ?s a dbo:Person ; dbo:birthDate ?v1 . 
    ?s dbo:birthYear ?v2 . 
    BIND(year(xsd:date(?v1)) as ?vv1) . 
    BIND(xsd:integer(?v2) as ?vv2) . 
    FILTER(?vv1 != ?vv2) 
} 
+0

ありがとうございました!私はvv1とvv2が同じタイプであると信じていました。私は間違っていた。 – ValQc

関連する問題