如何修复从SPARQL查询返回的数据集中的Unicode问题?

时间:2013-12-23 00:49:16

标签: unicode sparql dbpedia

目前,我在使用Dbpedia上的SPARQL(使用Virtuoso服务器)时遇到了Unicode解码问题的行。这是我得到Knut%C3%85ngstr%C3%B6m的一个例子。 正确的名字是KnutÅngström。很酷,现在我该怎么解决这个问题?我精心设计的查询是:

select distinct (strafter(str(?influencerString),str(dbpedia:)) as ?influencerString) (strafter(str(?influenceeString),str(dbpedia:)) as ?influenceeString) where {
  { ?influencer a dbpedia-owl:Person . ?influencee a dbpedia-owl:Person .
    ?influencer dbpedia-owl:influenced ?influencee .
    bind( replace( str(?influencer), "_", " " ) as ?influencerString )
    bind( replace( str(?influencee), "_", " " ) as ?influenceeString )
}
  UNION
  { ?influencee a dbpedia-owl:Person . ?influencer a dbpedia-owl:Person .
    ?influencee dbpedia-owl:influencedBy ?influencer .
    bind( replace( str(?influencee), "_", " " ) as ?influenceeString )
    bind( replace( str(?influencer), "_", " " ) as ?influencerString )
}
}

1 个答案:

答案 0 :(得分:2)

DBpedia wiki解释说英语DBpedia数据集中的资源标识符使用的是URI,而不是IRI,这意味着您最终会遇到像这样的编码问题。

  

3. Denoting or Naming “things”

     

DBpedia数据集中的每个内容都由可引用的表示   基于IRI或URI的表单引用   http://dbpedia.org/resource/Name,其中Name是从URL派生的   维基百科的源文章,有形式   http://en.wikipedia.org/wiki/Name。因此,每个DBpedia实体都是绑定的   直接发表维基百科文章。每个DBpedia实体名称都解析为   面向描述的Web文档(或Web资源)。

     

在DBpedia发布3.6之前,我们只使用了英文的文章名称   维基百科,但自从DBpedia发布3.7以来,我们也提供本地化的   包含http://xx.dbpedia.org/resource/Name等IRI的数据集,   其中xx是维基百科语言代码,名称取自   来源网址http://xx.wikipedia.org/wiki/Name

     

从DBpedia版本3.8开始,我们对大多数DBpedia实体使用IRI   名。 IRI更具可读性,通常比URI更可取,但是   为了向后兼容,我们仍然使用URI作为DBpedia资源   从英语维基百科和IRI中提取所有其他语言。   Turtle文件中的三元组使用所有语言的IRI,甚至是英语。

     

有关URI编码的若干细节应始终如此   被考虑在内。

在这种特殊情况下,看起来你真的不需要分解标识符,就像获取实体的标签一样。

## If things were guaranteed to have just one English label, 
## we could simply take ?xLabel as the value that we want with
## `select ?xLabel { … }`, but since there might be more than 
## one, we can group by `?x` and then take a sample from the
## set of labels for each `?x`.

select (sample(?xLabel) as ?label) {
  ?x dbpedia-owl:influenced dbpedia:August_Kundt ;
     rdfs:label ?xLabel .
  filter(langMatches(lang(?xLabel),"en"))
}
group by ?x

SPARQL results

稍微简化一下你的查询,我们可以这样做:

select
  (sample(?rLabel) as ?influencerName)
  (sample(?eLabel) as ?influenceeName)
where {
  ?influencer dbpedia-owl:influenced|^dbpedia-owl:influencedBy ?influencee .
  dbpedia-owl:Person ^a ?influencer, ?influencee .

  ?influencer rdfs:label ?rLabel .
  filter( langMatches(lang(?rLabel),"en") )

  ?influencee rdfs:label ?eLabel .
  filter( langMatches(lang(?eLabel),"en") )
}
group by ?influencer ?influencee

SPARQL results

如果您不想在这些结果上添加语言标记,请添加对str()的调用:

select
  (str(sample(?rLabel)) as ?influencerName)
  (str(sample(?eLabel)) as ?influenceeName)
where {
  ?influencer dbpedia-owl:influenced|^dbpedia-owl:influencedBy ?influencee .
  dbpedia-owl:Person ^a ?influencer, ?influencee .

  ?influencer rdfs:label ?rLabel .
  filter( langMatches(lang(?rLabel),"en") )

  ?influencee rdfs:label ?eLabel .
  filter( langMatches(lang(?eLabel),"en") )
}
group by ?influencer ?influencee

SPARQL results