如何在 dbpedia 中获取交响乐的作曲家?
How to get composer of a symphony in 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/
它给了我很多交响曲。我想 构造 我的三元组,添加我自己的 属性,这是 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 .
}
但我不知道如何获取 ?composer
变量的绑定。
你知道怎么做吗?
(我知道可能没有办法得到它,如果你认为没有办法,请告诉我,我会通过,不幸的是,那些数据)
在 DBPedia 中似乎没有明确的关系将这些交响乐与代表作曲家的实际资源联系起来。
一个可能的解决方法是从类别的 prefLabel
中提取作曲家的名字,方法是剪掉第一位 ("Symphonies by"):
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 基础 IRI 连接,将解决这个问题。然而,这很脆弱,因为不能保证资源存在,即使存在,它是否 实际上 识别了作曲家(可能有不止一个 Hans Werner Henze,因为实例)。
当然,您可以通过执行后续查询来进一步扩展这一点,以 验证 资源是否存在并且是正确的,但这需要一些额外的试验和错误。如果目标只是作曲家的名字,那么第一个示例查询应该适用于大多数情况。
这是我的查询
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/
它给了我很多交响曲。我想 构造 我的三元组,添加我自己的 属性,这是 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 .
}
但我不知道如何获取 ?composer
变量的绑定。
你知道怎么做吗?
(我知道可能没有办法得到它,如果你认为没有办法,请告诉我,我会通过,不幸的是,那些数据)
在 DBPedia 中似乎没有明确的关系将这些交响乐与代表作曲家的实际资源联系起来。
一个可能的解决方法是从类别的 prefLabel
中提取作曲家的名字,方法是剪掉第一位 ("Symphonies by"):
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 基础 IRI 连接,将解决这个问题。然而,这很脆弱,因为不能保证资源存在,即使存在,它是否 实际上 识别了作曲家(可能有不止一个 Hans Werner Henze,因为实例)。
当然,您可以通过执行后续查询来进一步扩展这一点,以 验证 资源是否存在并且是正确的,但这需要一些额外的试验和错误。如果目标只是作曲家的名字,那么第一个示例查询应该适用于大多数情况。