如何在Wikidata的SPARQL查询中实现多个GeonameID的批量查询
解决Wikidata SPARQL多GeonameID查询的问题
嘿,我来帮你搞定这个困扰你的SPARQL查询问题!你之前的写法出错主要是因为变量绑定的位置不对,下面给你两种正确的实现方式:
方法一:使用VALUES子句(推荐,性能更优)
这是查询多个值最常用也最高效的方式,核心是把GeonameID的值绑定到属性值变量上,而不是条目变量:
SELECT ?id WHERE { ?id wdt:P1566 ?geonameId . VALUES ?geonameId { "6359304" "6299427" } }
解释一下:我们先让?id关联它的GeonameID属性值到?geonameId变量,然后用VALUES指定这个变量可以匹配的多个字符串值,这样就能找出所有拥有这两个GeonameID的Wikidata条目了。你之前错误地把VALUES绑定到了?id,但?id是Wikidata的条目URI,不是GeonameID字符串,所以匹配不上。
方法二:使用FILTER IN
如果更习惯用FILTER的写法,也要注意过滤的是属性值变量,而非条目变量:
SELECT ?id WHERE { ?id wdt:P1566 ?geonameId . FILTER (?geonameId IN ("6359304", "6299427")) }
这里的关键是FILTER作用在?geonameId上——也就是wdt:P1566对应的属性值,而不是?id本身。你之前的写法把?id放进IN里,相当于在过滤条目URI,这显然和你要找GeonameID的需求不匹配。
两种方法都能得到你想要的结果,当查询的GeonameID数量较多时,优先用VALUES,Wikidata的查询引擎对这种写法的优化效果更好。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

