能否通过Wikidata API的gas:service或mediawiki:categoryTree将指定分类属性纳入查询结果?
我来帮你梳理一下怎么搞定这个问题——你在数据转储里能看到的那些分类属性和统计数据,确实可以通过编程方式拿到,只是得用对正确的接口和姿势,下面分几种方法给你拆解:
Wikidata本身的SPARQL查询默认是基于定期转储的,没法直接拿到实时的页面数/子分类数,但可以通过Wikibase MWAPI服务调用MediaWiki的API来获取这些实时统计,同时还能拿到HiddenCategory属性。
举个例子,下面的SPARQL查询可以获取Wikidata分类条目对应的维基百科分类的页面数、子分类数,以及是否为隐藏分类:
SELECT ?category ?categoryLabel ?pageCount ?subcatCount ?isHidden WHERE { # 筛选Wikidata中的分类条目(P31=Q4167836表示“分类”) ?category wdt:P31 wd:Q4167836 . # 调用MediaWiki API获取分类信息 SERVICE wikibase:mwapi { bd:serviceParam wikibase:endpoint "en.wikipedia.org"; wikibase:api "Query"; mwapi:action "query"; mwapi:titles ?categoryTitle; mwapi:prop "categoryinfo|info". # 提取API返回的页面数、子分类数、隐藏标记 ?pageCount wikibase:apiOutput "query/pages/*/categoryinfo/pages". ?subcatCount wikibase:apiOutput "query/pages/*/categoryinfo/subcats". ?isHidden wikibase:apiOutput "query/pages/*/info/hidden". # 把Wikidata URI解码为分类标题 ?categoryTitle wikibase:decodeValue ?category. } # 自动添加分类标签 SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } } LIMIT 10
如果不需要和Wikidata条目关联,直接调用MediaWiki的核心API是最直接的方式,你提到的mediawiki:categoryTree和gas:service(Generator API)都能派上用场:
1. 获取分类的基础统计(pages、subcategories、HiddenCategory)
用query模块的prop=categoryinfo+info可以一次性拿到分类的页面数、子分类数,以及是否为隐藏分类:
GET /w/api.php?action=query&titles=Category:Physics&prop=categoryinfo|info&format=json
返回结果里的categoryinfo字段包含pages(页面数)、subcats(子分类数);info字段里的hidden值为true时,说明该分类是隐藏分类(对应mediawiki:HiddenCategory属性)。
2. 用categoryTree服务遍历分类树
如果你需要获取分类的层级结构,同时包含子分类、页面数和隐藏分类标记,可以用categorytree模块:
GET /w/api.php?action=categorytree&format=json&category=Category:Physics&options=hiddencategories,counts&depth=2
options=hiddencategories会返回隐藏分类的信息options=counts会显示每个分类下的页面+子分类总数(如果需要分开统计,还是得结合categoryinfo)depth控制遍历的层级深度
3. 用GAS(Generator API)批量统计分类成员
gas:service其实就是MediaWiki的Generator API,适合批量获取分类下的页面/子分类,同时统计数量或检查隐藏属性。比如下面的请求可以获取分类下的所有页面和子分类,同时标记是否为隐藏项:
GET /w/api.php?action=query&generator=categorymembers&gcmtitle=Category:Physics&gcmtype=page|subcat&gcmlimit=50&prop=info&inprop=hidden&format=json
generator=categorymembers指定批量获取分类成员gcmtype=page|subcat只返回页面和子分类prop=info&inprop=hidden获取每个成员的隐藏状态
- 实时数据 vs 转储数据:Wikidata Query Service的默认数据是转储快照,要实时数据必须调用MediaWiki API
- 权限限制:部分隐藏分类可能需要特定权限才能访问,但公开的隐藏分类(比如系统级的)一般可以正常获取
- 速率限制:API调用要遵守MediaWiki的速率限制,避免被封禁
内容的提问来源于stack exchange,提问作者Butterfly

