目前,我在使用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 )
}
}
答案 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
稍微简化一下你的查询,我们可以这样做:
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
如果您不想在这些结果上添加语言标记,请添加对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