如何获取Wikidata条目的所有子项(不含实例)
嘿,要搞定Wikidata里获取条目所有类层级(完全排除实例)的需求,核心就是利用P279(子类)属性构建SPARQL查询,我分两种常见场景给你拆解方案:
场景1:目标条目是实例(比如三角内衣厂火灾 Q867316)
实例本身不属于类层级,所以第一步得先通过P31(实例)找到它所属的类,再沿着P279向上遍历所有父类,形成完整的类链。
对应的SPARQL查询
SELECT ?item ?itemLabel ?parent ?parentLabel WHERE { # 第一步:找到实例对应的类 wd:Q867316 wdt:P31 ?class . # 遍历类的父类链(包含类自身) ?class wdt:P279* ?item . # 可选:获取每个类的直接父类,方便梳理层级关系 OPTIONAL { ?item wdt:P279 ?parent . } # 自动加载多语言标签(优先显示浏览器语言,其次英文) SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } ORDER BY ?item
查询结果说明
返回的结果会是:
- 灾害(Q3839081)→ 事件(Q1190554)→ 时间实体(Q26907166)
完全排除了实例(三角内衣厂火灾)本身,只保留类层级。
场景2:目标条目是类(比如世界博览会 Q172754)
如果目标本身就是类,直接沿着P279向上遍历父类链即可,不需要额外找实例对应的类。
对应的SPARQL查询
SELECT ?item ?itemLabel ?parent ?parentLabel WHERE { # 遍历目标类的父类链(包含类自身) wd:Q172754 wdt:P279* ?item . # 可选:获取每个类的直接父类 OPTIONAL { ?item wdt:P279 ?parent . } SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". } } ORDER BY ?item
查询结果说明
返回的完整类链是:
- 世界博览会(Q172754)→ 展览会(Q464980)→ 活动(Q1656682)→ 事件(Q1190554)→ 时间实体(Q26907166)
额外小技巧
如果你想向下获取某个类的所有子类(而不是向上找父类),只需要把查询里的?class wdt:P279* ?item(或对应类的语句)改成?item wdt:P279* ?class,调换主体和宾语的位置就行。
内容的提问来源于stack exchange,提问作者zadrozny
相关产品推荐
相关产品推荐

