如何在 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。估计数据不好。您可以在查询中将其删除为 .
是否可以过滤掉在 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。估计数据不好。您可以在查询中将其删除为