SPARQL XSD: Gleichstellung der DateTime
-
21-09-2019 - |
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.
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: