You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动