【问题标题】:Get nationality of person using DBPedia and SPARQL使用 DBPedia 和 SPARQL 获取人的国籍
【发布时间】:2014-03-17 11:23:05
【问题描述】:

我有以下 SPARQL 查询:

SELECT ?nationalityLabel WHERE {
  dbpedia:Henrik_Ibsen dbpedia-owl:nationality ?nationality .
  ?nationality rdfs:label ?nationalityLabel .
}

我检查了 Henrik Ibsen 是否存在,并且他有国籍本体/属性: http://dbpedia.org/page/Henrik_Ibsen

这是一个本体: http://dbpedia.org/ontology/nationality

与此处列出的非常相似的查询有效: https://stackoverflow.com/a/10248653/1680130

我遇到的问题是查询没有返回任何结果。

如果我能得到帮助解决这个问题,那就太好了。

总结解决方案: 这两个答案都非常好,但最终都落在了 Joshua 上,因为告知 dbpedia-owl 更清洁。我认为的最佳解决方案:

首先使用 dbpedia-owl 检查出生地:

select ?label { 
 dbpedia:Henrik_Ibsen
   dbpedia-owl:birthPlace
     [ a dbpedia-owl:Country ;
       rdfs:label ?label ]
 filter langMatches(lang(?label),"en")
}

如果找到然后得到恶魔:

select ?label { 
 dbpedia:Norway dbpedia-owl:demonym ?label
 filter langMatches(lang(?label),"en")
}

如果上述失败,则执行“脏”查询:

SELECT
  ?nationality
WHERE {
  dbpedia:Henrik_Ibsen dbpprop:nationality ?nationality .
 filter langMatches(lang(?nationality),"en")
}

当然是“脏”意味着数据正确但不经常出现顺序可能会更好,因为人们可以出生在一个国家但来自不同的国家。

【问题讨论】:

    标签: sparql dbpedia


    【解决方案1】:

    Kristian's answer 正确的是,亨利克·易卜生拥有的财产是dbpprop:nationality。你是对的,也有一个dbpedia-owl:nationality 属性,但不幸的是,Henrik Ibsen 没有它的价值。不过,Henrik Ibsen 拥有的 dbpprop:nationality 的值是一个字符串,它是一个文字,而文字不能是 RDF 中三元组的主题,因此您的查询中的 ?nationality rdfs:label ?nationalityLabel 永远不会匹配。

    DBpedia 本体数据 (dbpedia-owl) 往往比 dbpprop 数据更干净,因此您可能更喜欢使用 Henrik Ibsen 所拥有的 dbpedia-owl 属性的解决方案。在这种情况下,您可能会查看dbpedia-owl:birthPlace。然后你可以得到出生地所在国家的名字:

    select ?label { 
     dbpedia:Henrik_Ibsen
       dbpedia-owl:birthPlace
         [ a dbpedia-owl:Country ;
           rdfs:label ?label ]
    }
    

    SPARQL results

    您可能希望缩小允许的语言:

    select ?label { 
     dbpedia:Henrik_Ibsen
       dbpedia-owl:birthPlace
         [ a dbpedia-owl:Country ;
           rdfs:label ?label ]
     filter langMatches(lang(?label),"en")
    }
    

    SPARQL results

    这些查询将产生国家名称,但它需要相应的demonym,如果可用,您可以获得国家/地区的dbpedia-owl:demonym 值。最好将恶魔名称设为可选,因为粗略的调查表明 DBpedia 中的许多国家/地区都没有它的值,因此国家/地区的名称可能是唯一的选择。例如,

    select ?name ?demonym { 
      dbpedia:Henrik_Ibsen dbpedia-owl:birthPlace ?country .
      ?country a dbpedia-owl:Country ; rdfs:label ?name .
      optional { ?country dbpedia-owl:demonym ?demonym }
    
      filter langMatches(lang(?name),"en")
      filter langMatches(lang(?demonym),"en")
    }
    

    SPARQL results

    【讨论】:

    • 这为我发现了一个很酷的新问题。如果我像 Henrik_Ibsen 那样拥有字符串“Norwegian”,那么如何识别该国籍值对应的国家? (应该是http://dbpedia.org/page/Norway
    • @Kristian 我也在想同样的问题,因为“挪威”和“挪威”之间有明显的区别。 DBpedia 可能有也可能没有这些信息;我想知道 WordNet 是否可以?
    • @Kristian 我认为在要求出生地获得国家名称(挪威)时,您可以获得“挪威”的 dbpedia-owl:demonym 属性,您将获得“挪威”。
    • @JoshuaTaylor 这很酷。更不用说,dbpedia-owl:demonym 听起来很金属。 \m/
    • @JoshuaTaylor 发现这个问题。出生地通常不仅是国家,而且是城市/地区。像他一样:dbpedia.org/page/Sam_Mendes 不知道如何从中提取国家...
    【解决方案2】:

    查询有两个问题:

    1. 这是 dbpprop:nationality
    2. 标签似乎不存在,除非您将该变量设为可选,否则它将完全消除该行。 编辑:*Joshua Taylor 的回答提醒我标签不存在,因为dbprop:nationality 值是文字,不能用作主题资源,因此,永远不会有标签dbpprop:nationality。相反,在数据存在的地方,您将使用您最初使用的dbpedia-owl:nationality。碰巧 Henrik_Ibsen 没有与他关联的 dbpedia-owl:nationality 值*

    更新的查询(更新)。

    SELECT
      #### ?label ####    See Edit
      ?nationality
    
    WHERE {
      dbpedia:Henrik_Ibsen dbpprop:nationality ?nationality .
      #### OPTIONAL { ?nationality rdfs:label ?label . } #### See Edit.
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多