如何修复SPARQL查询返回的数据集中的Unicode问题?
目前,在Dbpedia上使用SPARQL(使用Virtuoso服务器)时,我得到了带有Unicode解码问题的行。这是我得到的Knut%C3%85ngstr%C3%B6m的一个示例。 正确的名字是克努特·奥恩斯特罗姆。酷,现在我该怎么解决这个问题?我的查询是:如何修复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),
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