2017-01-05 2 views
0

Ist es möglich, Ergebnisse herauszufiltern, die einen nicht auflösbaren URI innerhalb der SPARQL-Abfrage enthalten?Wie filtert man nicht auflösbare URIs in einer SPARQL-Abfrage?

Ein Beispiel: Ich mache die folgende Abfrage (Endpunkt: 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>))} 

In den Ergebnissen, wie Sie es sehen können ist Tapferkeit Variable eine dreifache, die einen nicht auflösbaren URI enthält? (Text:/hostncbitaxid /) Ich würde gerne wissen, ob es einen bestimmten FILTER gibt, der in der SPARQL-Abfrage hinzugefügt werden kann, um diese Ergebnisse mit nicht auflösbaren URIs zu entfernen.

Ich habe Probleme mit der API, die ich verwende, um diese Ergebnisse in C# zu verarbeiten, weil es eine Ausnahme wegen nicht auflösbarer URIs zurückgibt, also möchte ich sie in der SPARQL-Abfrage herausfiltern (wenn möglich).

Antwort

3

Woher wissen Sie, dass es nicht auflösbar ist? RDF hat kein Konzept eines "relativen URI", alle URIs sind relativ zu etwas aufgelöst (und vielleicht zu dem, was in einigen Fällen ein Implementierungsdetail ist), so dass Sie absolute URIs erhalten. In den HTML-Ergebnissen von diesem Endpunkt bekomme ich http://linkeddata.systems:8890/hostncbitaxid/, und das könnte leicht auflösbar sein.

Das heißt, wenn Sie mit Ergebnissen enden, die nicht-absolute URIs enthalten, und Sie diese herausfiltern möchten, könnten Sie einige Heuristiken dazu verwenden. Zum Beispiel, wenn Sie nur URIs wollen, die mit http beginnen, können Sie das tun. Zum Beispiel, hier ist eine Abfrage, die zwei Werte für gibt uri:

prefix : <urn:ex:> 

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

(Beachten Sie, dass die relative URI /foobar als Datei aufgelöst wurde. // URI) Sie können halten nur http URIs mit einem Filter:

prefix : <urn:ex:> 

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

Hallo Joshua, danke für deine Antwort. Ich habe schon so etwas gemacht, aber das Problem ist, dass es eines der Ergebnisse herausfiltert, dass es kein URI ist (konkret, das wo? Valor ist "" Host - null - HOST_00561 "" ". Ist es möglich filtere nur die Werte von? valor mit dem Typ "URI" heraus, und das, wie du sagtest, nicht mit http? – alejandrorg

+1

@alejandrorg beginnt. Sicher, ändere den Filter einfach auf 'filter (! isURI (? x) || strstarts (str (? x), "http")) '. –

2

die Abfrage (SPARQL Ergebnisse im JSON-Format):

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

Diese schlechten Daten sind - es muss ein absoluter URI in RDF sein. Vermutlich sind die Daten schlecht. Sie können es in der Abfrage als @joshua-taylor shows entfernen.

Verwandte Themen