Вопрос

У меня есть запрос Sparql:

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, но я не мог понять это. Если у вас есть идея, пожалуйста, направляйте меня. Спасибо.

ОБНОВИТЬ

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

Я изучил реализации 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 значений для равенства, поэтому они никогда не равны. Например, когда я добавляю фильтр, редактируя текст запроса, я получаю желаемый результат после проверки равенства. Но когда я добавляю фильтр программно, сериализация двух фильтров одинакова, однако результат не тот же. Вот пример два запроса и их результат, немедленно показанный после них.

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 |
=========================
-------------------------

ОБНОВИТЬ

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

Это было полезно?

Решение

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

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

Даже если оператор = только равенство RDF в двигателе Sparql, который вы используете, вы все равно должны получить результаты, так как литералы все равно будут точно соответствовать.

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

Обновлять

Я подозреваю, но не могу сказать наверняка, что это может быть какой -то странной проблемой в XSD: DateTime Serialization/Deserialization. Я бы отправил электронное письмо в список рассылки для разработчиков Jena Developer с подробным описанием вашей проблемы и посмотрел, смогут ли разработчики и сообщество дать вам ответ на этот:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top