2017-01-05 89 views
0

是否可以在SPARQL查詢中篩選出包含不可解析的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>))} 

在結果中,你可以看到有在英勇變量,它包含非解析URI三? (文本:/ hostncbitaxid /)。我想知道是否有一些特定的FILTER可以在SPARQL查詢中添加,以便使用不可解析的URI刪除這些結果。

我遇到了我用來在C#中處理這些結果的API的問題,因爲它由於不可解析的URI而返回異常,所以我想在SPARQL查詢中將它們過濾掉(如果可能的話)。

回答

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的得到解決爲文件:// 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/> | 
----------------------------- 
+0

嗨,Joshua,謝謝你的回覆。我已經做了這樣的事情,但問題是,它過濾掉了一個不是URI的結果(具體地說,那個?valor是「」host - null - HOST_00561「@」的結果是否可能只過濾掉類型爲「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