2017-01-05 4 views
0

Est-il possible de filtrer les résultats contenant un URI non résoluble dans la requête SPARQL?Comment filtrer les URI non-résolvables sur une requête SPARQL?

Un exemple: je fais la requête suivante (critère d'évaluation: http://linkeddata.systems:8890/sparql):

PREFIX RO: <http://www.obofoundry.org/ro/ro.owl#> 
PREFIX SIO: <http://semanticscience.org/resource/> 
PREFIX EDAM: <http://edamontology.org/> 
PREFIX PHIO: <http://linkeddata.systems/ontologies/SemanticPHIBase#> 
PREFIX PUBMED: <http://linkedlifedata.com/resource/pubmed/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX up: <http://purl.uniprot.org/core/> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
SELECT DISTINCT ?disn_1 ?label ?rel ?valor 
WHERE { ?disn_1 ?rel ?valor . ?disn_1 rdfs:label ?label FILTER((?disn_1 = <http://linkeddata.systems/SemanticPHIBase/Resource/host/HOST_00561>))} 

Dans les résultats, comme vous pouvez le voir, il est variable valeur un triple qui contient un URI non résoluble? (texte:/hostncbitaxid /). Je voudrais savoir s'il existe un FILTRE spécifique qui peut être ajouté dans la requête SPARQL pour supprimer ces résultats avec des URI non-résolvables. Je rencontre des problèmes avec l'API que j'utilise pour traiter ces résultats en C# car elle renvoie une exception due aux URI non résolvables, donc je voudrais les filtrer dans la requête SPARQL (si possible).

Répondre

3

Comment savez-vous que ce n'est pas résolvable? RDF n'a pas de concept d'un "URI relatif", tous les URI sont résolus par rapport à quelque chose (et peut-être à ce qui est un détail d'implémentation dans certains cas), donc vous obtenez des URI absolus. Dans les résultats HTML de ce point de terminaison, j'obtiens http://linkeddata.systems:8890/hostncbitaxid/, et cela pourrait facilement être résolu. Cela dit, si vous obtenez des résultats qui incluent des URI non absolus et que vous voulez les filtrer, vous pouvez utiliser des heuristiques pour le faire. Par exemple, si vous voulez seulement des URI commençant par http, vous pouvez le faire. Par exemple, voici une requête qui retourne deux valeurs pour uri:

prefix : <urn:ex:> 

select * where { 
    values ?uri { <http://www.example.org/> </foobar> } 
} 
----------------------------- 
| uri      | 
============================= 
| <http://www.example.org/> | 
| <file:///foobar>   | 
----------------------------- 

(Notez que l'URI relative /foobar se est résolu en tant que fichier :. // URI) Vous pouvez ne garder que http URIs avec un filtre :

prefix : <urn:ex:> 

select * where { 
    values ?uri { <http://www.example.org/> </foobar> } 
    filter strstarts(str(?uri), "http") 
} 
----------------------------- 
| uri      | 
============================= 
| <http://www.example.org/> | 
----------------------------- 
+0

Salut Joshua, merci pour votre réponse. J'ai déjà fait quelque chose comme ça, mais le problème est qu'il filtre l'un des résultats que ce n'est pas un URI (concrètement, celui où? Valor est "" Host - null - HOST_00561 "@en". Est-il possible de filtrer uniquement les valeurs de? valor avec le type "URI" et que, comme vous l'avez dit, ne commence pas par http? – alejandrorg

+1

@alejandrorg Bien sûr, il suffit de changer le filtre à 'filter (! isURI (? x) || strstarts (str (? x), "http")) '. –

2

Les rendements de la requête (résultats SPARQL au format JSON):

"valor": { "type": "uri", "value": "/hostncbitaxid/" }} 

Ce sont de mauvaises données - il doit être un URI absolu dans RDF. Vraisemblablement, les données sont mauvaises. Vous pouvez le supprimer dans la requête en tant que @joshua-taylor shows.