2016-05-23 63 views
0

這是我的查詢如何在dbpedia中獲得交響曲的作曲家?

select * 
{ 
?symphonies_by_composer <http://www.w3.org/2004/02/skos/core#broader> <http://dbpedia.org/resource/Category:Symphonies_by_composer> . 
?symphony <http://purl.org/dc/terms/subject> ?symphonies_by_composer . 
} 

我跑過來DBpedia的終點http://dbpedia.org/sparql/

它給了我很多的交響曲。我想構建我的三倍,加上我自己的財產,這是莫:composedBy這樣的:

PREFIX mo: <http:blablabla.com/mo#> 

construct 
{ 
?symphony mo:composedBy ?composer . 
?symphony a mo:Symphony 
} 
{ 
?symphonies_by_composer <http://www.w3.org/2004/02/skos/core#broader> <http://dbpedia.org/resource/Category:Symphonies_by_composer> . 
?symphony <http://purl.org/dc/terms/subject> ?symphonies_by_composer . 
} 

,但我不知道怎麼去爲?composer變量綁定。

你知道嗎?

(我知道,有可能是沒有辦法得到它,如果你覺得沒有辦法,請讓我知道,我會傳球,可惜的是,這些數據)

+0

CONSTRUCT查詢的第二部分基本上是您在編寫SELECT查詢時要做的事情。而且您只能查詢DBpedia中的數據。例如,有屬性「http:// dbpedia.org/property/composer」和「http:// dbpedia.org/ontology/composer」,但正如你所知,並非所有的音樂都有關於它的信息。 – AKSW

回答

2

好像有在DBPedia中,這些交響曲與代表作曲家的實際資源之間沒有明確的關係。

可能的解決方法是提取從該類別的prefLabel作曲家的名字,被剪斷的第一位(「通過交響樂」):

PREFIX mo: <http://example.com/mo#> 
PREFIX dct: <http://purl.org/dc/terms/> 
PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
CONSTRUCT 
{ 
     ?symphony mo:composedBy ?composer_name . 
     ?symphony a mo:Symphony 
} 
    WHERE 
{ 
    ?symphonies_by_composer skos:broader <http://dbpedia.org/resource/Category:Symphonies_by_composer> ; 
          skos:prefLabel ?label . 
    ?symphony dct:subject ?symphonies_by_composer . 
    BIND(SUBSTR(STR(?label), (STRLEN("Symphonies by ") + 1)) AS ?composer_name) 
} 

這會給你回的名稱每個作曲家都是一個文字值。

第二個可能的步驟是嘗試從名稱中重建標識作曲家的資源的實際IRI。例如,對於「Hans Werner Henze」,識別該人的實際資源是http://dbpedia.org/resource/Hans_Werner_Henze,因此,簡單的進一步字符串操作或兩個操作(替換空格並與dbpedia base IRI連接)將解決此問題。然而,這是脆弱的,因爲不能保證資源存在,即使它確實存在,實際上是是否標識了作曲家(例如,可能有多於一個漢斯維爾納亨澤)。

當然,您可以通過執行後續查詢來進一步擴展,驗證該資源是否存在並且是正確的,但這需要一些額外的試驗和錯誤。如果目標僅僅是作曲家的名字,那麼第一個示例查詢應該可以在大多數情況下正常工作。

+0

這就是我最終做的,第一種方法。雖然我不喜歡鈴蘭的價值,所以我將它改爲IRI –