2016-05-23 26 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 –