如何编写SPARQL查询从Wikidata获取Scotland的指定属性?
正确查询Wikidata中Scotland的实例类型、子类及所属关系的SPARQL语句
我来帮你排查下问题,你的原SPARQL查询里有几个关键错误,导致要么无结果要么超时:
- 属性ID混淆:instance of对应的是
wdt:P31,你错误地用了wdt:P361(这是part of的属性ID),还重复绑定了两次; - 模糊匹配低效:
FILTER(CONTAINS(?label, "Scotland"))会匹配所有包含该字符串的条目,容易触发超时,用精准的标签匹配更高效; - 未处理属性缺失:如果某个属性没有值,严格的绑定会直接过滤掉整个条目,用
OPTIONAL能保留有值的属性结果。
下面是修正后的查询语句,你可以直接在Wikidata查询编辑器中运行:
SELECT ?instanceOfLabel ?subclassOfLabel ?partOfLabel WHERE { # 精准定位英文标签为"Scotland"的条目 ?scotland rdfs:label "Scotland"@en; wdt:P31 ?instanceOf. # instance of(实例类型)对应属性P31 # 可选匹配子类和所属关系,避免属性缺失时无结果 OPTIONAL { ?scotland wdt:P279 ?subclassOf } OPTIONAL { ?scotland wdt:P361 ?partOf } # 自动获取人类可读的英文标签 SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
关键部分说明:
?scotland rdfs:label "Scotland"@en:直接定位到Scotland的Wikidata条目(Q22),比模糊匹配速度快很多;wdt:P31 ?instanceOf:正确绑定instance of属性,对应你在网页上看到的“英国境内的国家”这类实例;OPTIONAL包裹属性查询:确保即使某个属性没有值,其他有值的属性依然能正常返回结果;- 选择带
Label后缀的变量:直接返回可读的标签文本,而非Wikidata的QID编号。
如果需要同时获取QID和标签,可以用这个版本:
SELECT ?instanceOf ?instanceOfLabel ?subclassOf ?subclassOfLabel ?partOf ?partOfLabel WHERE { ?scotland rdfs:label "Scotland"@en; wdt:P31 ?instanceOf. OPTIONAL { ?scotland wdt:P279 ?subclassOf } OPTIONAL { ?scotland wdt:P361 ?partOf } SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
内容的提问来源于stack exchange,提问作者Olscream
相关产品推荐
相关产品推荐

