SPARQL Wikidata - 如何结合两个查询来检索对象信息

SPARQL Wikidata - How to combine two queries to retrieve object information

我有以下问题,我用一个例子来解释:

我想从 三元组 Germany - capital - object.

中检索 对象 Berlin

必须使用标签,因为它们是我程序中的输入。

以下查询返回 propertyLabel capital:

prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wikibase: <http://wikiba.se/ontology#>
prefix bd: <http://www.bigdata.com/rdf#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?propertyLabel WHERE {
    ?property a wikibase:Property .
    ?property rdfs:label "capital"@en
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
}

使用 label GermanyURI P36 (capital) 的后续查询返回所需信息 Berlin

prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wikibase: <http://wikiba.se/ontology#>
prefix bd: <http://www.bigdata.com/rdf#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?objectLabel WHERE {
    ?subject wdt:P36 ?object . 
    ?subject rdfs:label "Germany"@en .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
}

但我想使用 P36 作为 标签。我用两个 Selects 或一个 Union 尝试了各种方法,但我得到了数千个结果或 none。查询应如下所示(尽管这个查询不起作用):

prefix wdt: <http://www.wikidata.org/prop/direct/>
prefix wikibase: <http://wikiba.se/ontology#>
prefix bd: <http://www.bigdata.com/rdf#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?objectLabel WHERE {
    ?subject ?property ?object . 
    ?subject rdfs:label "Germany"@en .
    ?property a wikibase:Property .
    ?property rdfs:label "capital"@en
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
}

上面已经提到的查询必须 return Berlin 而不是别的。提前致谢。

问题是您 属性 查找标签 "capital" returns http://www.wikidata.org/entity/P36 但实例数据使用 http://www.wikidata.org/prop/direct/P36。解决方法可能是:

PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT ?objectLabel WHERE {
  ?subject ?property ?object ;
           rdfs:label "Germany"@en .
  ?p a wikibase:Property ;
     rdfs:label "capital"@en
  BIND(STRAFTER(STR(?p), STR(wd:)) as ?p_localname)
  BIND(IRI(CONCAT(STR(wdt:), ?p_localname)) as ?property)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" .} 
}