是否可以过滤掉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(text:/ hostncbitaxid /)。我想知道是否有一些特定的FILTER可以添加到SPARQL查询中,以便用不可解析的URI删除这些结果。
我遇到了用于在C#中处理这些结果的API的问题,因为它由于不可解析的URI而返回异常,所以我想在SPARQL查询中过滤掉它们(如果可能的话)
答案 0 :(得分:3)
你怎么知道它不可解析? RDF没有“相对URI”的概念,所有的URI都是相对于某些东西进行解析的(也许在某些情况下是针对什么是实现细节),所以最终会得到绝对的URI。在该端点的HTML结果中,我得到http://linkeddata.systems:8890/hostncbitaxid/
,这很容易解析。
也就是说,如果您最终得到包含非绝对URI的结果,并且您希望将其过滤掉,那么您可以使用一些启发式方法来做到这一点。例如,如果您只想要以 http 开头的URI,则可以执行此操作。例如,这是一个返回?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 URI 过滤器:
prefix : <urn:ex:>
select * where {
values ?uri { <http://www.example.org/> </foobar> }
filter strstarts(str(?uri), "http")
}
-----------------------------
| uri |
=============================
| <http://www.example.org/> |
-----------------------------
答案 1 :(得分:2)
查询返回(SPARQL结果为JSON格式):
"valor": { "type": "uri", "value": "/hostncbitaxid/" }}
这是错误的数据 - 它必须是RDF中的绝对URI。据推测,数据很糟糕。您可以在查询中将其删除为@joshua-taylor shows。