Wikidata SPARQL查询达豪集中营指挥官任期无返回结果问题咨询
查询错误拆解与修正方法
核心错误根源
- 忽略了两个属性的方向完全相反,照搬参考查询的匹配逻辑导致全量结果为空
你参考的可正常运行的教皇查询用的是P39(任职职位)属性,这个属性的固定方向是「任职的人 → 担任的职位实体」:也就是找所有带P39属性的人,这些人匹配的职位是wd:Q19546(教皇),再从任职陈述上取起止时间。
但你查询用到的P1037(指挥官)属性,方向和P39是完全反过来的:它的固定方向是「被指挥的单位/组织 → 担任指挥官的人」。也就是说,达豪集中营(wd:Q151198)是P1037的固定主语,P1037对应的宾语才是历任的指挥官(人类)。
你完全照搬P39的逻辑写出来的匹配,本质是在找「某个单位,它的指挥官是达豪集中营本身」——Wikidata里根本不存在这样的条目,达豪集中营是被指挥的机构,不是任何实体的指挥官,自然返回0条结果。 - 变量与属性的匹配关系完全错位
你最后给变量?KZ_Dachau绑定了wdt:P1559(人名属性),但按照你原来的匹配逻辑,这个变量对应的是“某个指挥官为达豪集中营的单位”,也就是机构实体,根本不会有人名类的属性,进一步把可能的匹配结果全部过滤掉了。 - 关于“取不到达豪集中营实体的任何属性”的问题:你的查询逻辑里根本没有把wd:Q151198作为固定的查询主语去提取它的属性,而是把它放到了ps:P1037的宾语匹配位置,还是在错位的逻辑链上,自然无法关联到它的实际属性值。
修正后的可运行查询
按照P1037的正确方向,调整后的完整代码如下:
SELECT ?commander ?name ?start ?end WHERE { # 固定主语为达豪集中营,匹配它所有的指挥官任职陈述 wd:Q151198 p:P1037 ?commanderShip. # 从任职陈述中取出当任的指挥官、任职起止时间 ?commanderShip ps:P1037 ?commander; pq:P580 ?start; pq:P582 ?end. # 提取指挥官的姓名 ?commander wdt:P1559 ?name. }
小优化:如果部分早期任职条目没有完整填写任职起止时间,硬匹配pq属性会把这些条目过滤掉,可以把日期匹配放到OPTIONAL块中提升召回率:
SELECT ?commander ?name ?start ?end WHERE { wd:Q151198 p:P1037 ?commanderShip. ?commanderShip ps:P1037 ?commander. OPTIONAL { ?commanderShip pq:P580 ?start; pq:P582 ?end. } ?commander wdt:P1559 ?name. }
内容的提问来源于stack exchange,提问作者MySt3rY
相关产品推荐
相关产品推荐

