使用DBPedia和SPARQL获取人员的国籍

时间:2014-02-17 23:27:21

标签: sparql dbpedia

我有以下SPARQL查询:

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

我已经检查过Henrik易卜生存在并且他有他的国籍本体/财产: http://dbpedia.org/page/Henrik_Ibsen

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

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

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

如果我能得到帮助解决这个问题就会很棒。

汇总解决方案: 两个答案都很棒,所以对两者都赞不绝口,但最终落在了Joshua's上,因为告知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")
}

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

2 个答案:

答案 0 :(得分:3)

Kristian's answer对于Henrik Ibsen所拥有的属性dbpprop:nationality是正确的。你是对的,也有dbpedia-owl:nationality属性,但不幸的是,亨利克易卜生没有它的价值。但是,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

答案 1 :(得分:1)

查询有两个问题:

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

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