如何在 SPARQL 查询中过滤不可解析的 URI?

How to filter non-resolvable URIs on a SPARQL query?

是否可以过滤掉在 SPARQL 查询中包含不可解析 URI 的结果?

一个例子:我正在进行以下查询(端点: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 查询中添加一些特定的 FILTER,以删除那些具有不可解析 URI 的结果。

我在使用 API 在 C# 中处理这些结果时遇到问题,因为它由于无法解析的 URI 而返回异常,所以我想在SPARQL 查询(如果可能)。

你怎么知道它不可解析? RDF 没有 "relative URI" 的概念,所有 URI 都是相对于某物(在某些情况下可能是实现细节)解析的,因此您最终得到绝对 URI。在该端点的 HTML 结果中,我得到 http://linkeddata.systems:8890/hostncbitaxid/,这很容易解析。

就是说,如果您最终得到包含非绝对 URI 的结果,并且您想要过滤掉它们,您可以使用一些试探法来做到这一点。例如,如果您只想要以 http 开头的 URI,您可以这样做。例如,这是一个 returns 两个值 ?uri:

的查询
prefix : <urn:ex:>

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

(请注意,相对 URI /foobar 已解析为 file:// URI。)您只能保留 http 带有 filter 的 URI:

prefix : <urn:ex:>

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

查询 returns(SPARQL 结果为 JSON 格式):

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

这是错误数据 - 它必须是 RDF 中的绝对 URI。估计数据不好。您可以在查询中将其删除为 .