2017-06-19 2 views
1

Je rencontre un problème avec SPARQL lorsque je traite des types de données numériques.Propriétés numériques renvoyées en tant que chaîne par SPARQL

J'ai une ontologie (http://cabas.ugr.es/ontology/ugr) dans laquelle j'ai défini une paire de propriétés qui représentent le nombre d'étudiants qui sont d'un sexe particulier:

<http://cabas.ugr.es/ontology/ugr#hombres> 
        a owl:DatatypeProperty, owl:FunctionalProperty, rdf:Property ; 
    rdfs:label 
    "hombres"@es, 
    "men"@en ; 
    rdfs:comment 
    "Número de estudiantes hombres."@es, 
    "Number of male students."@en ; 
    rdfs:range xsd:nonNegativeInteger ; 
    rdfs:isDefinedBy <http://cabas.ugr.es/ontology/ugr#> ; 
    owl:sameAs <http://cabas.ugr.es/ontology/ugr#hombres> ; 
    owl:inverseOf <http://cabas.ugr.es/ontology/ugr#mujeres> ; 
    ns1:term_status "stable" . 

<http://cabas.ugr.es/ontology/ugr#mujeres> 
        a owl:DatatypeProperty, owl:FunctionalProperty, rdf:Property ; 
    rdfs:label 
    "mujeres"@es, 
    "women"@en ; 
    rdfs:comment 
    "Número de estudiantes mujeres."@es, 
    "Number of female students."@en ; 
    rdfs:range xsd:nonNegativeInteger ; 
    rdfs:isDefinedBy <http://cabas.ugr.es/ontology/ugr#> ; 
    owl:sameAs <http://cabas.ugr.es/ontology/ugr#mujeres> ; 
    owl:inverseOf <http://cabas.ugr.es/ontology/ugr#hombres> ; 
    ns1:term_status "stable" . 

J'ai un point final SPARQL monté sur Virtuoso (http://cabas.ugr.es:8890/sparql), dans lequel j'entre par exemple la requête suivante:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX ugr: <http://cabas.ugr.es/ontology/ugr#> 

SELECT ?X ?titulacion ?rama ?hombres ?mujeres 
WHERE { 
    ?X ugr:Titulación ?titulacion . 
    ?X ugr:RamaConocimiento ?rama . 
    ?X ugr:hombres ?hombres . 
    ?X ugr:mujeres ?mujeres 
} 

(qui correspondrait à this link)

Il retourne tous les enregistrements, mais les champs "hombres" et "mujeres" me les renvoie comme si c'était une chaîne au lieu d'une valeur numérique, par exemple il est impossible d'appliquer un filtre comme FILTER (?hombres > 500) . Une idée de ce que je me trompe?

Par ailleurs, l'ontologie et la ressource avec les valeurs sont accessibles par ces liens:

+1

La définition de la plage d'une propriété n'est pas suffisante. cela doit également se refléter dans les données d'instance en ajoutant le type de données à chaque littéral: ': x: hombres" 352 "' -> ': x: hombres" 352 "^^ xsd: nonNegativeInteger' – AKSW

Répondre

5

Afin de traiter les chiffres que les numéros, vous devez les définir en tant que tels.

En ce moment vous les définir comme des chaînes:

<http://cabas.ugr.es/resources/MatriculasGrado1516#21> 
    ns0:hombres "91" ; 
    ns0:mujeres "68" . 

Pour les définir comme des entiers, vous devez définir leur type à xsd:integer:

<http://cabas.ugr.es/resources/MatriculasGrado1516#21> 
    ns0:hombres "91"^^xsd:integer ; 
    ns0:mujeres "68"^^xsd:integer . 

Les chaînes peuvent également être effectués à l'entier dans les requêtes , si besoin. Par exemple:

FILTER(xsd:integer(?hombres) > 500) 
+0

C'est tout ce dont j'avais besoin pour ajouter pour le faire fonctionner. Merci! – germaaan