我正在使用 SPARQLWrapper 将 SPARQL 查询发送到 Wikidata。目前我正在尝试查找实体的所有属性。例如。使用一个简单的元组,例如:wd:Q11663 ?a ?b.
这本身就有效,但我试图为返回的属性和实体找到人类可读的标签。
虽然SERVICE wikibase:label
可以使用 Wikidata 的 GUI 界面,但这不适用于 SPARQLWrapper - 它坚持为变量及其“标签”返回相同的值。
查询属性rdfs:label
适用于实体 (?b),但此方法不适用于属性 (?a)。
看起来该属性正在以完整 URI 的形式返回,例如http://www.wikidata.org/prop/direct/P1536
. 使用 GUI 我可以成功查询wd:P1536 ?a ?b.
。如果我将它作为第二个查询发送,这适用于 SPARQLWrapper - 但不是在第一个查询中。
这是我的代码:
from SPARQLWrapper import SPARQLWrapper, JSON
sparql = SPARQLWrapper("http://query.wikidata.org/sparql")
sparql.setQuery("""
SELECT ?a ?aLabel ?propLabel ?b ?bLabel
WHERE
{
wd:Q11663 ?a ?b.
# Doesn't work with SPARQLWrapper
#SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
#?prop wikibase:directClaim ?p
# but this does (and is more portable)
?b rdfs:label ?bLabel. filter(lang(?bLabel) = "en").
# doesn't work
#?a rdfs:label ?aLabel.
# property code can be extracted successfully
BIND( strafter(str(?a), "prop/direct/") AS ?propLabel).
#BIND( CONCAT("wd:", strafter(str(?a), "prop/direct/") ) AS ?propLabel).
# No matches, even if I concat 'wd:' to ?propLabel
?propLabel rdfs:label ?aLabel
# generic search for any properties also fails
#?propLabel ?zz ?aLabel.
}
""")
# However, this returns a label for P1536 - which is one of wd:Q11663's properties
sparql.setQuery("""SELECT ?b WHERE
{
wd:P1536 rdfs:label ?b.
}
""")
那么如何在一个查询中获取属性的标签(应该更有效)?
[旁白:是的,我对 EN 过滤器有点粗鲁和准备好了——如果我没有得到任何回报,经常会放弃它]