我的问题是,如何才能从Wikidata中提取所有属性及其相应的标签,这些标签也最好通过SPARQL从wiki数据中提取出来。
以wikidata上的Google条目为例。对于属性P414(证券交易所)或P159,有子属性,例如P969(位于街道地址)。实际上,一旦您将query wbgetentities
用作限定符,它们就会显示出来。 wbgetentities
的问题是缺少标签。我通过以下SPARQL查询获得所需的输出(例如wdt:P17 => country => United States of America
):
SELECT ?prop_id ?prop_label ?prop_val_label WHERE {
VALUES (?company) {
(wd:Q95)
}
?company ?prop_id ?company_item.
?wd wikibase:directClaim ?prop_id.
?wd rdfs:label ?prop_label.
OPTIONAL {
?company_item rdfs:label ?prop_val.
FILTER((LANG(?prop_val)) = "en")
}
BIND(COALESCE(?prop_val, ?companyItem) AS ?prop_val_label)
FILTER((LANG(?prop_label)) = "en")
}
但是缺少那些“子属性”,因为它们没有直接声明。要提取单个语句限定符,我可以执行以下操作:SELECT ?company ?hq ?country WHERE {
wd:Q95 p:P159 ?company.
OPTIONAL {
?company ps:P159 ?hq.
?company pq:P17 ?country.
}
}
但是问题是,是否有一种方法可以将所有内容组合到一个查询中? 最佳答案
Wikidata数据模型上的有用链接:
您的查询应为此类:
SELECT ?wdLabel ?ps_Label ?wdpqLabel ?pq_Label {
VALUES (?company) {(wd:Q95)}
?company ?p ?statement .
?statement ?ps ?ps_ .
?wd wikibase:claim ?p.
?wd wikibase:statementProperty ?ps.
OPTIONAL {
?statement ?pq ?pq_ .
?wdpq wikibase:qualifier ?pq .
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} ORDER BY ?wd ?statement ?ps_
Try it!
结果中仅包含限定词及其值。既不包括出处引用,也不包括值注释(例如时间精度)。如果您需要添加评论,请写评论。