2017-11-04 9 views
0
でgYearの

こんにちは、私は(「1900」^^のxsd:gYearの)1900年の後にリヨンに生まれているDBpediaの人数から取得しようとしている。ここ はコードの私の作品です。コンバートのxsd:XSDの日付:SPARQL

prefix dbo: <http://dbpedia.org/ontology/> 
prefix foaf: <http://xmlns.com/foaf/0.1/> 
prefix dbr: <http://dbpedia.org/resource/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
select $n $birthDate 
{ 
    $p a dbo:Person. 
    $p dbo:birthPlace dbr:Lyon. 
    $p foaf:name $n. 
    $p dbo:birthDate $birthDate. 
    filter($birthDate > "1980"^^xsd:gYear). 
} 

そして、私は以下の結果を得ている: query results

答えて

1

私の理解からは、問題はデータにあります。多くの日付が有効なxsd:dateリテラルを持っていない、ので、比較は失敗します。 filter($birthDate > "1980-01-01"^^xsd:date)でも失敗します。 XMLスキーマによれば、xsd:dateは、"YYYY-MM-DD"の形式でリテラルを提供する必要があります。残念ながら、DBpediaの多くの日付ではそうではありません。有効な日付の場合、比較は完全に機能します。

回避策:

prefix dbo: <http://dbpedia.org/ontology/> 
prefix foaf: <http://xmlns.com/foaf/0.1/> 
prefix dbr: <http://dbpedia.org/resource/> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
select $n $birthDate ?year 
{ 
    $p a dbo:Person. 
    $p dbo:birthPlace dbr:Lyon. 
    $p foaf:name $n. 
    $p dbo:birthDate $birthDate. 
    filter($birthDate > "1980-01-01"^^xsd:date). 
    bind(replace(str($birthDate),"(\\d+)-\\d*-\\d*", "$1") as ?year) 
    filter(xsd:integer(?year) > 1980) 
} 

注意、それが病気に形成された日付の他の種類のために失敗することがあります。私はすべてのコーナーケースをチェックしなかった。

誰かがこれをDBpediaコミュニティに報告してください。それは修正する必要があります。