我寫這個詞庫查詢: 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 .
}.
}
請查看SPARQL 1.1屬性路徑:https://www.w3.org/TR/sparql11-query/#propertypaths – AKSW