2017-01-05 18 views
0

Возможно ли отфильтровывать результаты, содержащие неразрешимый URI в запросе SPARQL?Как фильтровать неразрешимые URI в запросе SPARQL?

Пример: Я делаю следующий запрос (конечная точка: 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>))} 

В результатах, как вы можете видеть, что есть в доблести переменная тройка, которая содержит не разрешимый URI? (текст:/hostncbitaxid /). Я хотел бы знать, есть ли какой-то определенный FILTER, который можно добавить в запрос SPARQL, чтобы удалить эти результаты с неразрешимыми URI.

У меня возникли проблемы с API, которые я использую для обработки этих результатов на C#, потому что он возвращает исключение из-за неразрешимых URI, поэтому я хотел бы отфильтровать их в запросе SPARQL (если возможно).

ответ

3

Откуда вы знаете, что это не разрешимо? RDF не имеет понятия «относительного URI», все URI разрешены относительно чего-то (и, возможно, того, что является деталью реализации в некоторых случаях), поэтому вы получаете абсолютные URI. В результатах HTML от этой конечной точки я получаю http://linkeddata.systems:8890/hostncbitaxid/, и это может быть легко разрешимо.

При этом, если вы закончите с результатами, которые включают в себя не абсолютные URI, и вы хотите отфильтровать их, вы можете использовать некоторые эвристики для этого. Например, если вам нужны только URI, начинающиеся с http, вы можете это сделать. Например, вот запрос, который возвращает два значения для URI:

prefix : <urn:ex:> 

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

(Обратите внимание, что относительный URI /Foobar был решен как файла:. // URI) Вы можете держать только HTTP URIs с фильтром:

prefix : <urn:ex:> 

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

Привет, Джошуа, спасибо за ваш ответ. Я уже сделал что-то подобное, но проблема в том, что он отфильтровывает один из результатов, что это не URI (конкретно, тот, где «valor is» «Host-null-HOST_00561« @en ». отфильтруйте только те значения «valor» с типом «URI» и что, как вы сказали, не начинается с http – alejandrorg

+1

@alejandrorg. Конечно, просто измените фильтр на 'filter (! isURI (? x) || strstarts (str (? x), "http")). –

2

Отдача запроса (результаты SPARQL в формате JSON):

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

Это плохо данные - он должен быть абсолютным URI в RDF. Предположительно, данные плохие. Вы можете удалить его в запросе как @joshua-taylor shows.