Как отфильтровать неразрешимые 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>))}

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

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


person alejandrorg    schedule 05.01.2017    source источник


Ответы (2)


Откуда вы знаете, что это неразрешимо? В 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 file://.) Вы можете сохранить только URI http с фильтр:

prefix : <urn:ex:>

select * where {
  values ?uri { <http://www.example.org/> </foobar> }
  filter strstarts(str(?uri), "http")
}
-----------------------------
| uri                       |
=============================
| <http://www.example.org/> |
-----------------------------
person Joshua Taylor    schedule 05.01.2017
comment
Привет Джошуа, спасибо за ваш ответ. Я уже делал что-то подобное, но проблема в том, что он отфильтровывает один из результатов, что это не URI (конкретно тот, где ?valor Host - null - HOST_00561@en. Можно ли отфильтровать только те значения ?valor с типом URI и которые, как вы сказали, не начинаются с http? - person alejandrorg; 06.01.2017
comment
@alejandrorg Конечно, просто измените фильтр на filter (!isURI(?x) || strstarts(str(?x), "http")). - person Joshua Taylor; 06.01.2017

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

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

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

person AndyS    schedule 05.01.2017