Frage

Ich habe eine Sparql -Abfrage:

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 .
  }

Dies gibt das folgende Ergebnis zurück, das auf einer bestimmten Ontologie festgelegt ist:

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

Ich möchte eine Zeitbeschränkung hinzufügen, um Ereignisse auszuwählen, die zu diesem Zeitpunkt stattfinden:

2010-01-19T16: 00: 00Z

Also füge ich meiner Abfrage ein Filterelement hinzu, das jetzt ist:

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 )
  }

Diese Zeitabfrage gibt jedoch die leere Ergebnisliste in derselben Ontologie zurück:

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

Offensichtlich fehlt mir etwas über Sparql oder XSD: DateTime -Vergleich, aber ich konnte es nicht herausfinden. Wenn Sie eine Idee haben, führen Sie mich bitte an. Vielen Dank.

AKTUALISIEREN

Ich verwende die ARQ -Implementierung von SPARQL, die in Jena Framework verwendet wird. Ich denke, es geht um die Implementierung nicht um die Ontologie oder Abfrage

Ich habe die Implementierungen von com.hp.hpl.jena.datatypes.xsd.xsddatetime und com.hp.hpl.jena.datatypes.xsd.abstractDatetime untersucht: http://grepcode.com/file/repo1.maven.org/maven2/com.hp.hpl.jena/jena/2.6.0/com/hp/hpl/jena/datatypes/xsd

und sah, dass ein DateTime -Objekt durch 9 Werte dargestellt wird:

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

Der Wert MSSCale ist immer 3, wenn das XSDDDATETIME -Objekt aus einem java.util.calendar -Objekt erstellt wird und die aus der Ontologie analysierten XSDDATETIME -Objekte immer Null sind. Darüber hinaus prüft die Vergleichsfunktion alle diese 9 Werte für Gleichheit, sodass sie niemals gleich sind. Wenn ich beispielsweise den Filter hinzufüge, indem ich einen Abfragetext bearbeite, erhalte ich das gewünschte Ergebnis nach Gleichstellungsüberprüfungen. Wenn ich den Filter programmatisch hinzufüge, ist die Serialisierung der beiden Filter gleich, das Ergebnis ist jedoch nicht gleich. Hier ist ein Beispiel zwei Abfragen und ihr Ergebnis sofort nach ihnen angezeigt.

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

AKTUALISIEREN

Ich stellte die gleiche Frage in Jena-dev und erfuhr, dass an der Abfrage oder dem Code nichts falsch ist. Dies ist ein Problem in Jena 2.6.0, es ist jedoch bereits in Jena 2.6.2 behoben.

War es hilfreich?

Lösung

Es ist offensichtlich nichts falsches an Ihrer Abfrage. Dies kann ein Problem sein, wie die Sparql -Engine, die Sie verwenden, den = Operator impliziert. Welchen Sparql -Motor verwenden Sie?

Der = Operator sollte die Gleichstellung von Wert durchführen, sodass Ihr Filter, da Sie erwarten, dass die meisten der gleichen Ergebnisse immer noch zurückgeben, wenn die Abfrage anhand Ihrer Ontologie bewertet wird.

Auch wenn der = Operator nur die RDF -Term Gleichstellung in der von Ihnen verwendeten Sparql -Engine durchführt, sollten Sie noch Ergebnisse erzielen, da die Literale immer noch genau übereinstimmen.

Wenn Sie welche Sparql -Engine Sie verwenden, und Kopien Ihrer tatsächlichen Ontologie, kann ich Ihnen möglicherweise eine bessere Antwort geben als "es sollte funktionieren".

Aktualisieren

Ich vermute, kann aber nicht mit Sicherheit sagen, dass dies ein seltsames Problem in XSD sein kann: Datetime Serialization/Deserialisierung. Ich würde eine E -Mail an die Mailingliste der Jena Developer senden, in der Ihr Problem aufgeführt ist und feststellen, ob die Entwickler und die Community Ihnen eine Antwort auf diese geben können:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top