如何通过Wikidata SPARQL查询仅获取条目的外部标识符
问题根因
你写的筛选查询返回无匹配结果,核心原因是混淆了Wikidata的命名空间规则:
- 你在三元组谓词位置匹配到的
?prop是wdt:前缀的直接取值谓词(比如wdt:P345代表IMDb ID属性的直接取值谓词) - 属性的类型元数据是挂载在
wd:前缀的属性实体上的(比如IMDb ID作为属性实体是wd:P345,wikibase:propertyType wikibase:ExternalId这个三元组是挂在wd:P345上,而非wdt:P345上)
直接拿谓词去匹配属性类型三元组,永远不会命中结果。另外你两个带VALUES的查询都在SELECT子句里声明了未做任何匹配绑定的?p2 ?p2Label变量,属于冗余无效写法,会返回全空的无意义列。
修正方法
通过wikibase:directClaim谓词关联属性实体和对应的直接取值谓词,再做类型筛选即可,修正后的可执行查询如下:
SELECT ?item ?value ?valueLabel ?propEntity ?propEntityLabel { VALUES (?item) {(wd:Q112133367)} # 匹配条目上的直接属性和对应取值 ?item ?directProp ?value . # 关联属性实体和它对应的直接取值谓词 ?propEntity wikibase:directClaim ?directProp . # 筛选类型为外部标识符的属性 ?propEntity wikibase:propertyType wikibase:ExternalId . # 加载中文、英文标签 SERVICE wikibase:label { bd:serviceParam wikibase:language "zh,en" } }
运行该查询返回的结果,和Wikidata条目页面「标识符」板块展示的内容完全一致,以Q112133367为例,会返回IMDb电影ID、烂番茄ID、AllMovie ID、eIDR ID等全部外部标识符及对应取值。
内容的提问来源于stack exchange,提问作者Everett
相关产品推荐
相关产品推荐

