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 Germany
和 URI 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" .}
}
我有以下问题,我用一个例子来解释:
我想从 三元组 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 Germany
和 URI 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" .}
}