为何针对Wikidata的该SPARQL查询会产生重复结果?
为什么你的Wikidata SPARQL查询会产生重复结果?
这问题其实挺常见的,核心问题出在你查询里的属性路径没有正确关联——你同时用了直接属性wdt:P102和陈述节点p:P102,但没把这两部分绑定到同一个政党条目上,导致SPARQL做了不必要的笛卡尔积,也就是把每个政党的起止日期和所有政党名称做了全组合匹配。
问题拆解
原来的查询里:
?person wdt:P102 ?party_name是直接拉取该人物关联的所有政党实体?person p:P102 ?party是拉取该人物的政党成员身份的陈述节点(每个陈述对应一段具体的政党任职经历,带起止日期)
这两个部分是独立的,SPARQL会把每个陈述(带日期)和所有政党名称配对,自然就出现了重复结果。
修正后的查询
要解决这个问题,你需要把陈述节点和它对应的政党实体绑定起来,用Wikidata的ps:前缀(陈述的主值属性)来关联:
SELECT ?person ?personLabel ?party_start ?party_end ?party_nameLabel WHERE { ?person wdt:P39 wd:Q4970706 . ?person p:P102 ?party . # 关键:通过ps:P102把陈述节点绑定到对应的政党实体 ?party ps:P102 ?party_name . OPTIONAL {?party pq:P580 ?party_start.} OPTIONAL {?party pq:P582 ?party_end.} SERVICE wikibase:label {bd:serviceParam wikibase:language "en" } }
修正说明
- 去掉了原来独立的
?person wdt:P102 ?party_name,改用?party ps:P102 ?party_name,这样每个陈述节点(对应一段任职经历)只会关联它自己对应的政党实体,不会再和其他政党乱配对。 ps:前缀专门用来获取陈述节点的主值,和pq:(陈述的限定属性,比如起止日期)配合,正好能完整获取一段任职经历的所有信息。
这样修改后,查询结果就会把每个人物的每一段政党任职经历(带对应起止日期)和正确的政党名称关联起来,不会再有重复啦。
内容的提问来源于stack exchange,提问作者Andrew White
相关产品推荐
相关产品推荐

