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

如何修复SPARQL查询返回的数据集中的Unicode问题?,unicode,sparql,dbpedia,Unicode,Sparql,Dbpedia,目前,在Dbpedia上使用SPARQL(使用Virtuoso服务器)时,我得到了带有Unicode解码问题的行。这是我得到的Knut%C3%85ngstr%C3%B6m的一个示例。 正确的名字是克努特·奥恩斯特罗姆。酷,现在我该怎么解决这个问题?我的查询是: select distinct (strafter(str(?influencerString),str(dbpedia:)) as ?influencerString) (strafter(str(?influenceeString),

目前,在Dbpedia上使用SPARQL(使用Virtuoso服务器)时,我得到了带有Unicode解码问题的行。这是我得到的Knut%C3%85ngstr%C3%B6m的一个示例。 正确的名字是克努特·奥恩斯特罗姆。酷,现在我该怎么解决这个问题?我的查询是:

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 )
}
}

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

DBpedia数据集中的每一项都由一个可取消引用的 基于IRI或URI的表单引用 ,其中名称是从URL派生的 Wikipedia文章的源代码,其形式为 . 因此,每个DBpedia实体都是绑定的 直接转到维基百科的文章。每个DBpedia实体名称解析为 面向描述的Web文档(或Web资源)

在DBpedia 3.6版之前,我们只使用英文的文章名 但是自从DBpedia发布3.7以来,我们还提供了本地化的 包含类虹膜的数据集, 其中xx是维基百科语言代码,名称取自 源URL

从dbpedia3.8版开始,我们对大多数DBpedia实体使用IRIs 名字。IRI更具可读性,通常比URI更可取,但 为了向后兼容,我们仍然对DBpedia资源使用uri 摘自英语维基百科和所有其他语言的IRIs。 Turtle文件中的三元组对所有语言都使用IRIs,甚至对英语也是如此

关于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()
的调用:


什么查询产生了结果?请注意,“关于您编写的代码问题的问题必须在问题本身中描述具体问题,并包括复制问题的有效代码。”在这种情况下,您可以提供一个查询,我们可以将其粘贴到中。我提供了该查询。我从一天起就一直在解决这个问题,“但是没有用!”汉帕桑:谢谢你。手动方式,但很好。我正在寻找一种与SPARQL更相关的方法来实现这一点,但是很好。此外,我有30000行,你提到的站点没有处理那么多,并抛出了一个错误。很好,但不想要“”和@en。当我在编写解析器时,这是不必要的,而且会使我的生活更加困难。你不想要
”是什么意思?我在结果中没有看到任何
。如果您想要一个简单的文本,那么只需使用它的
str()
。这些都是非常基本的SPARQL函数……无论如何,我已经更新了答案,展示了如何剥离语言标记。在这两种情况下,结果都是字符串;您不应该解析来自端点的表格输出;如果您需要机械地处理它,那么请确保您正在使用XML、JSON、RDF或其他机器可读的输出格式。啊,我想我明白您的意思了。在端点呈现的表格输出中,带有语言标记的字符串打印为
“string content”@lang
。纯文本(没有数据类型或语言标记的字符串)只是作为
内容打印出来(没有引号)。但都是文字;如果使用代码处理此输出,则应以机器可读的格式(例如,XML或RDF)获得结果。XML或RDFAPI将使您能够轻松获得所需的值。然而,最初的疑问仍然在我的答案中;我用附加的问题更新了答案。再次感谢Joshua。我已经完成了这个过程,它与我的非速记SPARQL查询配合得非常好。我感谢您帮助解决这个问题。我还想知道是否有一种方法可以真正使用SPARQL创建nodes.csv和edges.csv文件,而不使用Java进行解析,但这超出了范围。我还是在使用Java。您是否在使用Java中的RDF/SPARQL库?如果使用,则从查询结果中获取字符串值将非常简单,例如。除非有特殊的原因,否则将结果作为CSV获取并手动解析似乎最好花在其他地方(但我不知道具体的场景,所以可能是有原因的)。
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