如何用SPARQL从Wikidata筛选仅为欧洲议会议员的任职记录?
正确获取欧洲议会议员及任职元数据的SPARQL查询
我来帮你修正这个SPARQL查询问题,先说说你之前写法的问题,再给你正确的解决方案:
为什么你的修改后查询无结果?
你第二个查询里的?positionheld wdt:P31 wd:Q27169是错误的——Wikidata里wd:Q27169本身就是「欧洲议会议员」这个职位,它的类型(P31)是立法职位(wd:Q2285706),不是它自己。所以这个条件永远匹配不到任何结果,自然返回空。而且你之前的写法确实冗余,既然已经用?human wdt:P39 wd:Q27169限定了人员担任该职位,没必要再额外关联?positionheld。
正确的查询写法(含任职元数据)
如果你想获取议员的任职起始日期、所属政党等元数据,需要用到Wikidata的「声明(statement)」机制,因为这些信息是职位属性的限定词,不是直接的人员属性。下面是完整的查询:
SELECT ?human ?humanLabel ?startDate ?party ?partyLabel ?endDate WHERE { # 匹配所有拥有「欧洲议会议员」职位声明的人员 ?human p:P39 ?mepStatement . # 明确该声明对应的职位是欧洲议会议员(wd:Q27169) ?mepStatement ps:P39 wd:Q27169 . # 可选获取:任职起始日期(有些现任议员可能没有结束日期) OPTIONAL { ?mepStatement pq:P580 ?startDate } . # 可选获取:所属政党 OPTIONAL { ?mepStatement pq:P102 ?party } . # 可选获取:任职结束日期 OPTIONAL { ?mepStatement pq:P582 ?endDate } . # 自动获取多语言标签(优先当前语言,其次英文) SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" . } } ORDER BY ?humanLabel
关键部分解释:
p:P39:表示获取人员的「职位」属性的声明对象,而不是直接的属性值,这样才能访问该职位的所有限定信息。ps:P39:声明对象中的职位值,这里指定为wd:Q27169(欧洲议会议员)。pq:P580/pq:P102/pq:P582:分别是职位声明的「起始日期」「所属政党」「结束日期」限定词。OPTIONAL:确保即使某些议员没有某类元数据(比如现任议员没有结束日期),也能返回结果,不会被过滤掉。
简化版(仅获取议员列表)
如果你只需要所有曾担任欧洲议会议员的人员列表,不需要元数据,写法更简单:
SELECT ?human ?humanLabel WHERE { ?human wdt:P39 wd:Q27169 . SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" . } } ORDER BY ?humanLabel
这个查询直接匹配所有拥有「欧洲议会议员」职位的人员,不会返回其他职位信息。
内容的提问来源于stack exchange,提问作者Ottotos
相关产品推荐
相关产品推荐

