2016-08-17 106 views
2

我創建了一個SPARQL查詢來比較,如果的dbo:birthDate年是從dbo:birthYear的值不同:如何比較日期值(xsd:date)與SPARQL中的年份?

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 

正確的答案是唯一的資源5 ,其年份爲birthDate等於1998,而birthYear等於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