Sparql 如何在dbpedia中找到交响乐作曲家?

Sparql 如何在dbpedia中找到交响乐作曲家?,sparql,rdf,owl,ontology,dbpedia,Sparql,Rdf,Owl,Ontology,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 . } 选择*

这是我的问题

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端点上运行它

它给了我很多交响乐。我想构造我的三元组,添加我自己的属性,即mo: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 .
}
前缀mo:
构造
{
莫言交响曲:作曲家。
?交响乐团:交响乐团
}
{
作曲家的交响曲。
交响乐?作曲家创作的交响乐。
}
但是我不知道如何获得
?composer
变量的绑定

你知道怎么做吗


(我知道可能没有办法,如果你认为没有办法,请告诉我,不幸的是,我会传递这些数据)

在DBPedia中,似乎没有明确的关系将这些交响乐与代表作曲家的实际资源联系起来

一种可能的解决方法是通过剪掉第一位(“Symphonies by”)从类别的
预标签中提取作曲家的姓名:

前缀mo:
前缀dct:
前缀skos:
构造
{
莫氏交响乐团:作曲家?作曲家姓名。
?交响乐团:交响乐团
}
哪里
{
?作曲家斯科斯的交响曲:范围更广;
skos:prefLabel?标签。
?交响乐dct:主题?作曲家的交响乐。
BIND(SUBSTR(STR(?label),(STRLEN(“交响乐”)+1))作为作曲家(姓名)
} 
这将以文本值的形式返回每个编写器的名称

第二个可能的步骤是尝试从名称中重建资源的实际IRI,以识别作曲家。例如,在“Hans-Werner-Henze”的情况下,识别此人的实际资源是
http://dbpedia.org/resource/Hans_Werner_Henze
,因此,再进行一两次简单的字符串操作,替换空格并用dbpedia base IRI连接,就可以解决这个问题。然而,这是脆弱的,因为无法保证资源存在,即使存在,也无法保证它是否确实识别了作曲家(例如,可能不止一个Hans-Werner-Henze)


当然,您可以通过执行后续查询来进一步扩展此功能,以验证资源是否存在以及是否正确,但这需要一些额外的尝试和错误。如果目标只是编写器的名称,那么第一个示例查询对于大多数实例来说应该可以正常工作

DBPedia中似乎没有明确的关系将这些交响乐与代表作曲家的实际资源联系起来

一种可能的解决方法是通过剪掉第一位(“Symphonies by”)从类别的
预标签中提取作曲家的姓名:

前缀mo:
前缀dct:
前缀skos:
构造
{
莫氏交响乐团:作曲家?作曲家姓名。
?交响乐团:交响乐团
}
哪里
{
?作曲家斯科斯的交响曲:范围更广;
skos:prefLabel?标签。
?交响乐dct:主题?作曲家的交响乐。
BIND(SUBSTR(STR(?label),(STRLEN(“交响乐”)+1))作为作曲家(姓名)
} 
这将以文本值的形式返回每个编写器的名称

第二个可能的步骤是尝试从名称中重建资源的实际IRI,以识别作曲家。例如,在“Hans-Werner-Henze”的情况下,识别此人的实际资源是
http://dbpedia.org/resource/Hans_Werner_Henze
,因此,再进行一两次简单的字符串操作,替换空格并用dbpedia base IRI连接,就可以解决这个问题。然而,这是脆弱的,因为无法保证资源存在,即使存在,也无法保证它是否确实识别了作曲家(例如,可能不止一个Hans-Werner-Henze)


当然,您可以通过执行后续查询来进一步扩展此功能,以验证资源是否存在以及是否正确,但这需要一些额外的尝试和错误。如果目标只是编写器的名称,那么第一个示例查询对于大多数实例来说应该可以正常工作

构造查询的第二部分基本上是编写SELECT查询时要执行的操作。您只能查询DBpedia中的数据。例如,有属性
http://dbpedia.org/property/composer
http://dbpedia.org/ontology/composer
,但正如您所知,并非所有音乐都有相关信息。构造查询的第二部分基本上是编写SELECT查询时要做的事情。您只能查询DBpedia中的数据。例如,有属性
http://dbpedia.org/property/composer
http://dbpedia.org/ontology/composer
,但正如你所知,并不是所有的音乐都有关于它的信息。这确实是我最后做的,第一种方法。虽然我不喜欢lirel值,所以我把它改成了iri,这确实是我最后做的,第一种方法。虽然我不喜欢lirel值,所以我把它改成了IRI
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)
}