2016-08-03 82 views
-1

我寫這個詞庫查詢: http://vocabs.ceh.ac.uk/evn/tbl/envthes.evn#http%3A%2F%2Fvocabs.lter-europe.net%2FEnvThes%2F10000SPARQL - 遞歸查詢來獲取一個術語,它的所有多層次的孩子

SPARQL的終點是在這裏: http://vocabs.ceh.ac.uk/evn/tbl/swp?_viewClass=endpoint:HomePage 只需選擇「甕:X-EVN -pub:envthes「作爲默認圖形。

它返回按術語「度量」(http://vocabs.lter-europe.net/EnvThes/10004)排序的每個術語。它按照需要工作,但問題是它既不優雅也不容易寫。

所以我要尋找一個更好的方式來編寫以下查詢:

select distinct ?concept (str(?prefLab) as ?label) (str(?altlab) as ?code) 
(str(?p) as ?parent) (str(?pl) as ?parlab) ("EnvThes" as ?source) 

WHERE { 
?concept <http://www.w3.org/2004/02/skos/core#broader> ?level2. 
?concept <http://www.w3.org/2004/02/skos/core#prefLabel> ?prefLab. 
OPTIONAL {?concept <http://www.w3.org/2004/02/skos/core#altLabel> ?altlab. 
    FILTER (lang(?altlab)='en'). 
}. 

OPTIONAL {?concept <http://www.w3.org/2004/02/skos/core#broader> ?p. 
?p <http://www.w3.org/2004/02/skos/core#prefLabel> ?pl} 
OPTIONAL 
{?level2 <http://www.w3.org/2004/02/skos/core#broader> ?level3. 
OPTIONAL 
{?level3 <http://www.w3.org/2004/02/skos/core#broader> ?level4. 
OPTIONAL 
{?level4 <http://www.w3.org/2004/02/skos/core#broader> ?level5. 
OPTIONAL 
{?level5 <http://www.w3.org/2004/02/skos/core#broader> ?level6. 
OPTIONAL 
{?level6 <http://www.w3.org/2004/02/skos/core#broader> ?level7. 
OPTIONAL 
{?level7 <http://www.w3.org/2004/02/skos/core#broader> ?level8. 
OPTIONAL 
{?level8 <http://www.w3.org/2004/02/skos/core#broader> ?level9. 
OPTIONAL 
{?level9 <http://www.w3.org/2004/02/skos/core#broader> ?level10. 
}.}.}.}.}.}.}.}. 

FILTER(
    ?level10 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level9 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level8 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level7 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level6 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level5 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level4 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level3 = <http://vocabs.lter-europe.net/EnvThes/10004> || 
    ?level2 = <http://vocabs.lter-europe.net/EnvThes/10004>). 
FILTER(lang(?prefLab) = 'en'). 
} 

有沒有什麼辦法讓這個遞歸?我對Sparql仍然很陌生,並且很難寫出實際上起作用的查詢。

謝謝。

編輯:哇。感謝超級有用的回答和評論。我已經能夠重寫查詢。爲了完整起見,我將把它放在這裏,但信用屬於約書亞泰勒。

縮短查詢:

prefix skos: <http://www.w3.org/2004/02/skos/core#> 
prefix envthes: <http://vocabs.lter-europe.net/EnvThes/> 
select * { 
    values ?category { envthes:10004 } 
    ?concept skos:broader* ?category . 
    ?concept skos:prefLabel ?prefLab . 

    filter langMatches(lang(?prefLab), 'en') 
    optional { 
    ?concept skos:altLabel ?altlab 
    filter langMatches(lang(?altLabel), 'en') 
    }. 
    OPTIONAL {?concept skos:altLabel ?altlab. 
    FILTER (lang(?altlab)='en').}. 
    OPTIONAL {?concept skos:broader ?parent. 
    ?parent skos:prefLabel ?parLab . 
    }. 
} 
+4

請查看SPARQL 1.1屬性路徑:https://www.w3.org/TR/sparql11-query/#propertypaths – AKSW

回答

2

這是不完全一樣的查詢,我可能已經扭轉了概念和類別之間的聯繫(我從來不記得確切的語義方向skos:更廣泛的,以及它應該走哪條路)。主要的變化在這裏,雖然是使用前綴使查詢更具可讀性,並使用屬性路徑(SKOS:更廣泛的*)鏈接類別和概念?。我還使用塊將?概念綁定到您提到的特定固定值。

prefix skos: <http://www.w3.org/2004/02/skos/core#> 

select * { 
    #-- specify the value for ?category (you can just 
    #-- use this inline, too, but defining it with 
    #-- values makes it easier to add others later, and 
    #-- can make the query easier to read) 
    values ?category { <http://vocabs.lter-europe.net/EnvThes/10004> } 

    #-- require that ?concept is related to ?category 
    #-- by a chain skos:broader properties of length 
    #-- zero or more. (Zero means that ?concept can be 
    #-- ?category. Use skos:broader+ to require a path 
    #-- of length one or more.) 
    ?concept skos:broader* ?category . 

    #-- get an preferred label in English (required) 
    ?concept skos:prefLabel ?prefLab . 
    filter langMatches(lang(?prefLab), 'en') 

    #-- get an alternative label in English (optional) 
    optional { 
    ?concept <http://www.w3.org/2004/02/skos/core#altLabel> ?altlab 
    filter langMatches(lang(?altLabel), 'en') 
    } 
} 
相關問題