因为 DBpedia 区分大小写,所以我通过主题和类似人的标题大小写和大写版本;例如“Computer_programming”与“Alcia_Keys”。而不是传入 2 个单独的查询,实现这一目标的最有效方法是什么?
URI 应该被视为不透明的。虽然 DBpedia 通常具有一些不错的结构,因此您可以通过连接http://dbpedia.org/resource
和一些带有_
replace
的字符串来幸运,但这确实不是一种非常健壮的方式来做某事。一个更好的主意是注意你得到的字符串可能与某些资源的标签相同,以防万一。鉴于此,最好的想法是寻找具有相同标签的东西,模数大小写。例如,
select ?resource where {
values ?input { "AliCIA KeYS" }
?resource rdfs:label ?label .
filter ( ucase(str(?label)) = ucase(?input) )
}
不过,这实际上会很慢,因为您必须找到每个资源,对其标签进行一些字符串处理。这是一个不错的方法,但原则上。
可以做些什么来让它变得更好?好吧,如果你知道你在寻找什么样的东西,那将有很大帮助。例如,您可以将查询限制为 Persons:
select distinct ?resource where {
values ?input { "AliCIA KeYS" }
?resource rdf:type dbpedia-owl:Person ;
rdfs:label ?label .
filter ( ucase(str(?label)) = ucase(?input) )
}
这是一个进步,但它仍然不是那么快。它仍然,至少在概念上,必须接触每个人并检查他们的名字。一些 SPARQL 端点支持文本索引,如果您想有效地执行此操作,这可能就是您所需要的。
当然,最好的选择是简单地向您的用户询问更多信息,并提前对数据进行规范化。如果您的用户提供“AliCIA KEYS”,那么您可以对“Alicia Keys”@en 进行规范化,然后执行类似操作:
select distinct ?resource where {
values ?input { "Alicia Keys"@en }
?resource rdfs:label ?input .
}