2010-01-20 6 views
2

J'ai une requête SPARQL:SPARQL xsd: égalité 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 . 
    } 

qui renvoie le jeu de résultats suivant sur une ontologie:

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

Je veux ajouter une contrainte de temps pour sélectionner les événements qui se produira au moment:

2010-01-19T16: 00: 00Z

donc j'ajouter un élément filtrant à mon requête qui est maintenant:

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

Cependant, cette requête de temps retourne la liste de résultats vide sur la même ontologie:

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

Il est évident que je manque quelque chose SPARQL ou xsd: comparaison dateTime, mais je ne pouvais pas IT out. Si vous avez une idée, veuillez me guider. Merci.

MISE À JOUR

J'utilise la mise en œuvre ARQ de SPARQL qui est utilisé à Jena Framework.I pense que le problème est sur la mise en œuvre ne l'ontologie ou une requête

I a examiné les mises en œuvre de com.hp .hpl.jena.datatypes.xsd.XSDDateTime et com.hp.hpl.jena.datatypes.xsd.AbstractDateTime se trouve ici: http://grepcode.com/file/repo1.maven.org/maven2/com.hp.hpl.jena/jena/2.6.0/com/hp/hpl/jena/datatypes/xsd

et a vu qu'un objet dateTime est représenté par 9 valeurs:

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

La valeur msscale est toujours 3 lorsque l'objet XSDDateTime est créé à partir d'un objet et les objets java.util.Calendar XSDDateTime analysée à partir de l'ontologie est toujours zéro. De plus, la fonction de comparaison vérifie toutes ces 9 valeurs pour l'égalité afin qu'elles ne soient jamais égales. Par exemple lorsque j'ajoute le FILTER en modifiant le texte d'une requête, j'obtiens le résultat désiré après les vérifications d'égalité. Mais quand j'ajoute le FILTER par programme, la sérialisation des deux FILTERs est la même, mais le résultat n'est pas le même. Voici un exemple deux requêtes et leur résultat immédiatement affiché après eux.

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

MISE À JOUR

j'ai posé la même question dans jena-dev et a appris qu'il n'y a rien de mal à la requête ou le code. C'est un problème dans Jena 2.6.0 mais il est déjà corrigé dans Iéna 2.6.2.

Répondre

1

Il n'y a rien d'anormal dans votre requête, cela peut être un problème avec la façon dont le moteur SPARQL que vous utilisez implémente l'opérateur =. Quel moteur SPARQL utilisez-vous?

L'opérateur = devrait faire la valeur de l'égalité afin que votre filtre devrait comme vous attendez toujours retourner la plupart des mêmes résultats lorsque la requête est évaluée par rapport à votre ontologie.

Même si l'opérateur = ne fait que l'égalité des termes RDF dans le moteur SPARQL que vous utilisez, vous devriez quand même obtenir des résultats puisque les littéraux seront toujours identiques.

Si vous publiez quel moteur SPARQL vous utilisez et des copies de votre ontologie réelle je peux être en mesure de vous donner une meilleure réponse que « cela devrait fonctionner »

Mise à jour

Je soupçonne mais ne peut pas dire avec certitude que ceci peut être un problème étrange dans xsd: serialization/deserialization de dateTime. J'envoyer un courriel à la liste de diffusion des développeurs Jena détaillant votre problème et voir si les développeurs et la communauté peuvent vous donner une réponse sur celui-ci:

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

+0

De la discussion qui a suivi sur la liste de diffusion Jena c'était un bug qui était dû à l'utilisation d'une ancienne version d'Iéna par rapport à l'actuelle - les dernières versions avaient corrigé le bogue – RobV