2017-11-04 19 views
0

내가 1900 년 이후 리옹에서 태어난 DBpedia 명에서 검색하려고 해요 안녕하세요 ("1900"^^ XSD : gYear의) :변환 XSD : XSD에 날짜 : gYear의는 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 커뮤니티에 신고해야합니다. 그것은 고쳐 져야한다.