[英]SPARQL how to deal with different cased queries?
我还是SPARQL的新手。 我已经为我们的公司设置了一个dbpedia端点。 我不知道最终用户将要查询什么,并且由于DBpedia是区分大小写的,所以我既传递主题的标题大小写,也传递主题的大写版本,而不是像人一样。 例如“ Computer_programming”与“ Alcia_Keys”。 而不是传递2个单独的查询,最有效的方法是什么? 我已经尝试了IN运算符(从这个问题开始 ),但是我似乎在某个地方失败了。
select ?label ?abstract where {
IN (<http://dbpedia.org/resource/alicia_keys>, <http://dbpedia.org/resource/Alicia_Keys>) rdfs:label ?label;
dbpedia-owl:abstract ?abstract.
}
LIMIT 1"""
由于DBpedia区分大小写,因此我通过主题的标题和大写形式,而不是像人一样。 例如“ Computer_programming”与“ Alcia_Keys”。 而不是传递2个单独的查询,最有效的方法是什么?
URI应该被视为不透明的。 虽然DBpedia通常具有一些不错的结构,所以您可以通过将http://dbpedia.org/resource
和一些字符串替换为_
来幸运地进行 ,这实际上并不是执行某项操作的强大方法。 一个更好的主意是要注意,您得到的字符串可能与某些资源的标签相同,以防万一。 鉴于此,最好的主意是寻找带有相同标签,模数相同的东西。 例如,
select ?resource where {
values ?input { "AliCIA KeYS" }
?resource rdfs:label ?label .
filter ( ucase(str(?label)) = ucase(?input) )
}
但是,这实际上会非常慢,因为您必须找到每个资源,然后在其标签上进行一些字符串处理。 从原则上讲,这是一个不错的方法。
怎样做才能使它更好? 好吧,如果你知道你要找什么样的事情,这将有很大的帮助。 例如,您可以将查询限制为“人员”:
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,然后做一些事情ILKE:
select distinct ?resource where {
values ?input { "Alicia Keys"@en }
?resource rdfs:label ?input .
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.