【问题标题】:How to get a single name for multiple name properties in DBPedia with SPARQL?如何使用 SPARQL 在 DBPedia 中为多个名称属性获取单个名称?
【发布时间】:2015-06-17 15:08:56
【问题描述】:

我需要从 DBPedia 获取人名,但问题是并非每个人都有 dbpprop:fullname 属性,有时它只有 dbpprop:namerdfs:label 属性。

澄清一下:我想查询具有第一个属性的首选项的名称,如果不存在则获取第二个属性,如果不存在则获取第三个属性,等等。

那么我怎样才能从

   dbpprop:name (person name = [dbpprop:name] if no [dbpprop:fullname])

  rdfs:name (person name = [rdfs:name] if no both [dbpprop:fullname] and [dbpprop:name])

【问题讨论】:

    标签: sparql owl dbpedia


    【解决方案1】:

    您可以使用COALESCE 函数来做到这一点:

    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX foaf: <http://xmlns.com/foaf/0.1/>
    PREFIX dbpprop: <http://dbpedia.org/property/>
    
    SELECT DISTINCT ?x (COALESCE(?dbpfn, ?dbpn, ?label) as ?name) 
    WHERE { 
          ?x a foaf:Person .
          OPTIONAL { ?x dbpprop:fullname ?dbpfn }
          OPTIONAL { ?x dbpprop:name ?dbpn }
          OPTIONAL { ?x rdfs:label ?label }
    }
    LIMIT 100
    

    Result

    COALESCE 将参数列表作为输入,并输出与错误不对应的第一个参数。由于一个未绑定的变量对应一个错误,如果存在则返回全名,如果存在则返回名称,如果存在则返回标签。

    【讨论】:

    • 这也不起作用。它为同一查询提供多个答案。取消 10 个限制,看看它们是如何堆积起来的。
    • @Artemis 很好发现,谢谢,我忽略了由多个可选匹配引起的重复。幸运的是,修复很简单:添加一个 DISTINCT 关键字。已编辑,见上文。
    • 如果是这样,我建议的带有 distinct 的查询也会得到相同的结果。我认为关键是要做到这一点没有区别。
    • 不幸的是,您删除了答案,但据我所知:不,添加 distinct 不会修复您的查询,因为它们没有考虑属性优先级。谁说不使用 distinct?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多