我正试图为一组曾担任政治职务的人(爱丁堡大学的校友)返回结果。我想返回所担任办公室的标题标签,以及每个办公室的开始日期和结束日期,其中许多人担任多个职位。如果一个人只担任一个职位,但我似乎可以任其任职,也可以使其工作。
我当前的查询版本如下。这将给我开始日期和结束日期,但是如果办公室是政治办公室(例如英国[x]国会议员),? officeLabel返回的值例如:statement/Q4668868-E3734C7D-40F0-4D4A-8208-E3D6B8C944CB
SELECT DISTINCT ?alumni ?fullName ?roleLabel ?officeLabel ?start ?end WHERE {
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
?alumni wdt:P69 wd:Q160302.
?alumni rdfs:label ?fullName.
?alumni wdt:P106 ?role.
#Use Values to separate out politicians - Q82955
VALUES (?role) {
(wd:Q82955)
}
#Select only where position of office is stated but make dates optional
?alumni p:P39 ?office.
OPTIONAL { ?office pq:P580 ?start. }
OPTIONAL { ?office pq:P582 ?end. }
FILTER(LANGMATCHES(LANG(?fullName), "en"))
FILTER(NOT EXISTS { FILTER(LANGMATCHES(LANG(?fullName), "en-ca")) })
FILTER(NOT EXISTS { FILTER(LANGMATCHES(LANG(?fullName), "en-gb")) })
}
ORDER BY ?fullName
LIMIT 10
答案 0 :(得分:3)
是的,我还是被qualifiers和Wikidata Data Model绊倒了。
图由 作者:Michael F.Schönitzer-自己的作品,基于File:Rdf mapping.svg,CC 到4.0,https://commons.wikimedia.org/w/index.php?curid=63880194
从“项目”转到“ p:
路线”后,您需要“ ps:
路线”以返回“简单值”。
因此,使用它稍微修改您的查询会得到我认为想要的结果。
SELECT DISTINCT ?alumni ?fullName ?roleLabel ?officeLabel ?start ?end WHERE {
?alumni wdt:P69 wd:Q160302.
?alumni rdfs:label ?fullName.
?alumni wdt:P106 ?role.
VALUES (?role) {
(wd:Q82955)
}
?alumni p:P39 ?officeStmnt.
?officeStmnt ps:P39 ?office.
OPTIONAL { ?officeStmnt pq:P580 ?start. }
OPTIONAL { ?officeStmnt pq:P582 ?end. }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
FILTER(LANGMATCHES(LANG(?fullName), "en"))
FILTER(NOT EXISTS { FILTER(LANGMATCHES(LANG(?fullName), "en-ca")) })
FILTER(NOT EXISTS { FILTER(LANGMATCHES(LANG(?fullName), "en-gb")) })
}
ORDER BY ?fullName
LIMIT 10