SPARQL查询优化需求:为全球影院查询添加城市信息
优化后的全球未关闭影院SPARQL查询(带城市信息)
最终查询代码
SELECT DISTINCT ?cinema ?cinemaLabel ?adminUnit ?adminUnitLabel ?city ?cityLabel ?country ?countryLabel WHERE { # 筛选未关闭的影院:匹配所有影院子类,排除已关闭或有明确关闭日期的条目 ?cinema wdt:P31/wdt:P279* wd:Q41228. FILTER NOT EXISTS { ?cinema wdt:P1542 wd:Q12323195. } # 排除标记为"已关闭"的影院 FILTER NOT EXISTS { ?cinema wdt:P576 ?closureDate. } # 额外排除有关闭日期的条目 # 获取影院直接所属的行政单元 ?cinema wdt:P131 ?adminUnit. # 获取行政单元所属的国家 ?adminUnit wdt:P17 ?country. # 第一优先级:如果行政单元本身就是城市类(含城邦、城市聚居地等),直接作为城市 OPTIONAL { ?adminUnit wdt:P31/wdt:P279* ?cityType. VALUES ?cityType { wd:Q515 wd:Q133442 wd:Q7930989 wd:Q3624078 } BIND(?adminUnit AS ?city) } # 第二优先级:如果行政单元不是城市,找它的直接上级行政单元作为城市 OPTIONAL { # 确保只处理第一优先级没匹配到的情况 FILTER NOT EXISTS { ?adminUnit wdt:P31/wdt:P279* ?cityType. VALUES ?cityType { wd:Q515 wd:Q133442 wd:Q7930989 wd:Q3624078 } } ?adminUnit wdt:P131 ?city. ?city wdt:P31/wdt:P279* ?cityType. VALUES ?cityType { wd:Q515 wd:Q133442 wd:Q7930989 wd:Q3624078 } } # 自动获取多语言标签(这里用英文+中文,可按需调整) SERVICE wikibase:label { bd:serviceParam wikibase:language "en,zh". } } ORDER BY ?countryLabel ?cityLabel ?cinemaLabel
关键优化点(解决你的痛点)
- 干掉慢查询元凶:删掉了
(wdt:P131)*这种任意深度的路径查询——这种写法会让Wikidata遍历无数层级的行政关系,直接拖垮性能。改成固定1-2层的关联,只查直接上级,绝大多数场景都能覆盖到城市信息。 - 扩大城市匹配范围:不再死磕
wd:Q515(标准城市),把wd:Q133442(城市聚居地)、wd:Q7930989(城市级行政单位)、wd:Q3624078(城邦国家)都加进去,完美适配新加坡、华盛顿这类特殊条目。 - 分层匹配逻辑:先查行政单元本身是不是城市,没匹配到再查上级,减少无效关联,让查询引擎跑得更快。
- 双重过滤影院状态:同时用“关闭状态标记”和“关闭日期”过滤,确保结果都是未关闭的影院。
- 去重+排序:用
DISTINCT避免重复条目,按国家→城市→影院排序,导出到Excel后直接就能筛选。
自定义提示
- 如果需要覆盖更多城市类型,直接在
VALUES ?cityType里加对应的Wikidata QID就行。 - 极少数地区可能需要更深层级的行政关联,可以在第二个OPTIONAL里再加一层
?city wdt:P131 ?higherCity,但别加太多层,不然又会变慢。 - 标签语言可以调整,比如只留
"zh"就只显示中文标签。
内容的提问来源于stack exchange,提问作者Kenman
相关产品推荐
相关产品推荐

