DBpedia与Wikidata的SPARQL查询无结果及艺术运动查询求助
嘿,新手友好的SPARQL问题解决方案
问题1:DBpedia/Wikidata查询返回0结果?这些坑你大概率踩了
刚接触SPARQL的时候,返回0结果真的超让人头疼,我整理了几个最常见的原因,你可以挨个排查:
- 前缀写错/漏写:这是新手Top1错误!比如DBpedia必须声明
dbo:(本体属性)、dbr:(资源实体)这些前缀,Wikidata要加wd:(实体)、wdt:(属性),少一个都不行。比如你写?movement a ArtMovement而不是?movement a dbo:ArtMovement,系统根本不知道你说的是什么。 - 实体/属性拼写失误:比如把
dbo:artist写成dbo:artists,或者把印象派的实体dbr:Impressionism写成全小写,虽然SPARQL不区分大小写,但DBpedia的资源URI是区分的,写错就找不到匹配。 - 属性用错了:不同知识库的属性不一样!比如在Wikidata里找艺术运动的关联艺术家,要用
wdt:P135(属于艺术运动),而不是随便拿个类似的属性凑数;DBpedia里艺术运动的相关艺术家是dbo:artist,别搞混了。 - 过滤条件太苛刻:比如你强制要中文标签
FILTER(LANG(?name) = 'zh'),但很多艺术运动根本没有中文条目,自然返回0;或者限定了过窄的时间范围,比如只查1900年以前的,结果刚好没有符合的。 - 端点临时抽风:偶尔DBpedia或Wikidata的SPARQL端点会出小问题,你可以先跑个超简单的测试语句:
SELECT * WHERE { ?s ?p ?o } LIMIT 10,如果连这个都返回0,那就是服务的问题,等一会儿再试就行。
问题2:DBpedia艺术运动+三类关联艺术家的查询语句
我帮你写了一个精简版的查询,去掉了冗余前缀,还加了注释方便你理解,直接拿去用就行:
# 声明必要的前缀,不用加那些没用的 PREFIX dbr: <http://dbpedia.org/resource/> PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?movementName ?famousName ?peopleName ?influenceName WHERE { # 先定位所有艺术运动实体,获取它的名称 ?movement a dbo:ArtMovement ; rdfs:label ?movementName . # 1. 因该运动闻名的艺术家:关联运动且有代表作属于该运动 OPTIONAL { ?famousArtist dbo:associatedMovement ?movement ; dbo:notableWork ?famousWork ; rdfs:label ?famousName . ?famousWork dbo:movement ?movement . FILTER(LANG(?famousName) = 'en') # 改成'zh'可获取中文名称,注意中文数据不全 } # 2. 运动的相关人员:直接关联运动的艺术家 OPTIONAL { ?movement dbo:artist ?relatedPerson ; rdfs:label ?peopleName . FILTER(LANG(?peopleName) = 'en') } # 3. 影响该运动的人员:运动的影响者 OPTIONAL { ?movement dbo:influencedBy ?influencer ; rdfs:label ?influenceName . FILTER(LANG(?influenceName) = 'en') } # 过滤运动名称的语言,同样可改成'zh' FILTER(LANG(?movementName) = 'en') } LIMIT 100 # 限制结果数量,避免返回太多卡死
小提示:
- 用
OPTIONAL是因为不是每个艺术运动都同时有三类艺术家,这样不会因为某一类缺失就丢掉整个运动的结果 DISTINCT用来去重,避免同一个运动出现重复条目- 如果某些属性返回结果不对,你可以去DBpedia的属性页面确认属性定义,微调一下就行
内容的提问来源于stack exchange,提问作者Nga




