SPARQL技术咨询:如何检索Wikidata中宝可梦列表(wd:Q106036966)的数据?
嘿,我来帮你理清这个Wikidata SPARQL查询的问题!
先解决你的核心需求:从列表中获取宝可梦
你提到的宝可梦列表实体wd:Q106036966,在Wikidata里是通过**P1542(列表项)**这个专属属性来关联它包含的每一只宝可梦的。用这个属性写SPARQL就能直接拉出列表里的所有成员:
SELECT ?pokemon ?pokemonLabel WHERE { wd:Q106036966 wdt:P1542 ?pokemon. SERVICE wikibase:label { bd:serviceParam wikibase:language "zh". } } ORDER BY ?pokemonLabel
执行这个查询就能得到列表里的宝可梦实体和对应的中文名称啦。
为什么你之前找不到关联?
你说小火龙能向上追溯到这个列表,那是因为小火龙的实体里用了**P361(属于)**属性指向该列表——这是一种反向关联。你也可以用反向查询来获取所有属于这个列表的宝可梦:
SELECT ?pokemon ?pokemonLabel WHERE { ?pokemon wdt:P361 wd:Q106036966. SERVICE wikibase:label { bd:serviceParam wikibase:language "zh". } } ORDER BY ?pokemonLabel
你之前遗漏的点就是这个P1542属性:它是Wikidata专门给“列表类实体”设计的,用来让列表主动关联自己的成员;而P361是成员用来关联所属列表的属性,两者都能实现你的需求。
更靠谱的获取所有宝可梦的方式
其实如果你的目标是拿到所有宝可梦,完全不需要通过这个列表——直接查询宝可梦的父类wd:Q864的子类/实例更可靠,因为列表可能存在更新不及时、遗漏的情况,而类的继承关系是Wikidata系统定义的:
SELECT ?pokemon ?pokemonLabel WHERE { ?pokemon wdt:P279 wd:Q864. # P279代表"是...的子类/实例",匹配所有属于宝可梦类的实体 SERVICE wikibase:label { bd:serviceParam wikibase:language "zh". } } ORDER BY ?pokemonLabel
这个查询会返回所有被标记为宝可梦的实体,范围更全也更准确。
内容的提问来源于stack exchange,提问作者Alejandro Sacanell
相关产品推荐
相关产品推荐

