2010-01-20 5 views
2

У меня есть запрос SPARQL:SPARQL XSD: DATETIME равенство

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX person: <http://www.myOntDomain/person#> 
PREFIX likedEvent: <http://www.myOntDomain/likedEventRule#> 
PREFIX event: <http://www.myOntDomain/event#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX weather: <http://www.myOntDomain/weather#> 
PREFIX eventHasSuitableWeather: <http://www.myOntDomain/eventHasSuitableWeather#> 
PREFIX freeAtEvent: <http://www.myOntDomain/freeAtEventRule#> 

SELECT DISTINCT ?Event ?Person ?Time 
WHERE 
    { ?Person rdf:type    person:Person . 
    ?Event rdf:type    event:Event . 
    ?WeatherEvent 
       rdf:type    weather:WeatherEvent . 
    ?WeatherType rdf:type   weather:WeatherEventType . 
    ?Person likedEvent:likedEvents ?Event ; 
       freeAtEvent:freeAtEvent ?Event . 
    ?Event eventHasSuitableWeather:eventHasSuitableWeather true ; 
       event:eventHasDate ?Time . 
    ?Person person:hasName  ?PersonName ; 
       person:hasAge   ?PersonAge . 
    ?Event event:hasEventType ?EventType . 
    } 

который возвращает следующий результат, установленный на определенной онтологии:

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Event                 | Person           | Time                | 
===================================================================================================================================================================================================== 
| <http://www.myOntDomain/event#SyntheticPitchFootballMatch> | <http://www.myOntDomain/person#Ali> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SerlockHolmesMovie>   | <http://www.myOntDomain/person#Ali> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SerlockHolmesMovie>   | <http://www.myOntDomain/person#Ayse> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SyntheticPitchFootballMatch> | <http://www.myOntDomain/person#Veli> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/weather#AnkaraMuseumVisit>   | <http://www.myOntDomain/person#Ali> | "2010-01-19T17:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

Я хочу, чтобы добавить ограничение времени, чтобы выбрать события, которые будет происходить в то время:

2010-01-19T16: 00: 00Z

так добавить Фильтрующий элемент в мой запрос, который в настоящее время:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX person: <http://www.myOntDomain/person#> 
PREFIX likedEvent: <http://www.myOntDomain/likedEventRule#> 
PREFIX event: <http://www.myOntDomain/event#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX weather: <http://www.myOntDomain/weather#> 
PREFIX eventHasSuitableWeather: <http://www.myOntDomain/eventHasSuitableWeather#> 
PREFIX freeAtEvent: <http://www.myOntDomain/freeAtEventRule#> 

SELECT DISTINCT ?Event ?Person ?Time 
WHERE 
    { ?Person rdf:type    person:Person . 
    ?Event rdf:type    event:Event . 
    ?WeatherEvent 
       rdf:type    weather:WeatherEvent . 
    ?WeatherType rdf:type   weather:WeatherEventType . 
    ?Person likedEvent:likedEvents ?Event ; 
       freeAtEvent:freeAtEvent ?Event . 
    ?Event eventHasSuitableWeather:eventHasSuitableWeather true ; 
       event:eventHasDate ?Time . 
    ?Person person:hasName  ?PersonName ; 
       person:hasAge   ?PersonAge . 
    ?Event event:hasEventType ?EventType . 
    FILTER (?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime) 
    } 

Однако на этот раз запрос возвращает пустой список результата на том же онтология:

------------------------- 
| Event | Person | Time | 
========================= 
------------------------- 

Очевидно я кое-что о SPARQL или XSD: Обрыв сравнению DATETIME, но я не мог понять это из. Если у вас есть идея, пожалуйста, направляйте меня. Благодарю.

UPDATE

Я использую реализации ARQ в SPARQL, который используется в Йене Framework.I думаю, что проблема о реализации не онтология или запрос

Я рассмотрел реализацию com.hp .hpl.jena.datatypes.xsd.XSDDateTime и com.hp.hpl.jena.datatypes.xsd.AbstractDateTime можно найти здесь: http://grepcode.com/file/repo1.maven.org/maven2/com.hp.hpl.jena/jena/2.6.0/com/hp/hpl/jena/datatypes/xsd

и увидел, что объект DATETIME представлена ​​9 значений:

protected final static int CY = 0, M = 1, D = 2, h = 3, m = 4, s = 5, ms = 6, utc=7, msscale=8 

Значение msscale всегда 3, когда объект XSDDateTime создается из объекта java.util.Calendar и объектов XSDDateTime разобранного из онтологии всегда равна нулю. Кроме того, функция сравнения проверяет все эти 9 значений для равенства, чтобы они никогда не были равны. Например, когда я добавляю FILTER, редактируя текст запроса, я получаю желаемый результат после проверки равенства. Но когда я добавляю FILTER программно, сериализация двух ФИЛЬТРОВ одинакова, однако результат не является тем же. Вот пример двух запросов, и их результат сразу же отображается после них.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX person: <http://www.myOntDomain/person#> 
PREFIX likedEvent: <http://www.myOntDomain/likedEventRule#> 
PREFIX event: <http://www.myOntDomain/event#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX weather: <http://www.myOntDomain/weather#> 
PREFIX eventHasSuitableWeather: <http://www.myOntDomain/eventHasSuitableWeather#> 
PREFIX freeAtEvent: <http://www.myOntDomain/freeAtEventRule#> 

SELECT DISTINCT ?Event ?Person ?Time 
WHERE 
    { ?Person rdf:type    person:Person . 
    ?Event rdf:type    event:Event . 
    ?WeatherEvent 
       rdf:type    weather:WeatherEvent . 
    ?WeatherType rdf:type   weather:WeatherEventType . 
    ?Person likedEvent:likedEvents ?Event ; 
       freeAtEvent:freeAtEvent ?Event . 
    ?Event eventHasSuitableWeather:eventHasSuitableWeather true ; 
       event:eventHasDate ?Time . 
    ?Person person:hasName  ?PersonName ; 
       person:hasAge   ?PersonAge . 
    ?Event event:hasEventType ?EventType . 
    FILTER (?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime) 
    } 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
| Event                 | Person           | Time                | 
===================================================================================================================================================================================================== 
| <http://www.myOntDomain/event#SerlockHolmesMovie>   | <http://www.myOntDomain/person#Ayse> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SerlockHolmesMovie>   | <http://www.myOntDomain/person#Ali> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SyntheticPitchFootballMatch> | <http://www.myOntDomain/person#Veli> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
| <http://www.myOntDomain/event#SyntheticPitchFootballMatch> | <http://www.myOntDomain/person#Ali> | "2010-01-19T16:00:00Z"^^<http://www.w3.org/2001/XMLSchema#dateTime> | 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX person: <http://www.myOntDomain/person#> 
PREFIX likedEvent: <http://www.myOntDomain/likedEventRule#> 
PREFIX event: <http://www.myOntDomain/event#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX weather: <http://www.myOntDomain/weather#> 
PREFIX eventHasSuitableWeather: <http://www.myOntDomain/eventHasSuitableWeather#> 
PREFIX freeAtEvent: <http://www.myOntDomain/freeAtEventRule#> 

SELECT DISTINCT ?Event ?Person ?Time 
WHERE 
    { ?Person rdf:type    person:Person . 
    ?Event rdf:type    event:Event . 
    ?WeatherEvent 
       rdf:type    weather:WeatherEvent . 
    ?WeatherType rdf:type   weather:WeatherEventType . 
    ?Person likedEvent:likedEvents ?Event ; 
       freeAtEvent:freeAtEvent ?Event . 
    ?Event eventHasSuitableWeather:eventHasSuitableWeather true ; 
       event:eventHasDate ?Time . 
    ?Person person:hasName  ?PersonName ; 
       person:hasAge   ?PersonAge . 
    ?Event event:hasEventType ?EventType . 
    FILTER (?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime) 
    FILTER (?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime) 
    } 

------------------------- 
| Event | Person | Time | 
========================= 
------------------------- 

UPDATE

я задал тот же самый вопрос в Йене-разработчика и узнал, что нет ничего плохого в запросе или код. Это проблема в Jena 2.6.0, однако она уже исправлена ​​в Jena 2.6.2.

ответ

1

Нет ничего явно неправильного в вашем запросе, это может быть проблема с тем, как используемый вами механизм SPARQL реализует оператор =. Какой двигатель SPARQL вы используете?

Оператор = должен выполнять равенство по значению, поэтому ваш фильтр должен, как вы ожидаете, возвращать большинство тех же результатов, когда запрос оценивается против вашей онтологии.

Даже если оператор = только выполняет равенство термина RDF в используемом вами процессоре SPARQL, вы все равно должны получать результаты, так как литералы по-прежнему будут точно соответствовать.

Если вы пост, который SPARQL двигателя вы используете и копию вашей реальной онтологии я могу быть в состоянии дать вам лучший ответ, чем «он должен работать»

Update

Я подозреваю, но не может точно сказать, что это может быть какой-то странной проблемой в xsd: сериализации/десериализации сериализации DateTime. Я хотел бы отправить по электронной почте в список рассылки разработчиков Jena подробно вашу проблему и посмотреть, если разработчики и сообщество может дать вам ответ на этот:

http://tech.groups.yahoo.com/group/jena-dev/

+0

Из последующего обсуждения в списке рассылки Jena это было ошибка, связанная с использованием более старой версии Jena, чем нынешняя - в последних версиях исправлена ​​ошибка – RobV

Смежные вопросы