我对SPARQL仍然有点新鲜。我为我们公司设置了一个dbpedia端点。我不知道最终用户将查询什么,并且由于DBpedia区分大小写,我通过了标题案例&主题的大写版本与人类之类的东西;例如" Computer_programming" vs" Alcia_Keys"。而不是传递2个单独的查询,最有效的方法是什么?我已经尝试过IN操作符(来自this question),但我似乎在某个地方失败了。
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"""
答案 0 :(得分:3)
因为DBpedia是区分大小写的,所以我通过了标题案例&amp;大写 主题版本与人类相似;例如 “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) )
}
但实际上这很慢,因为你必须找到每个资源,在其标签上进行一些字符串处理。原则上这是一种不错的方法。
如何才能让它变得更好?好吧,如果你知道你正在寻找什么 kind ,那将会有很大帮助。例如,您可以将查询限制为人员:
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”进行规范化,然后做一些ilke:
select distinct ?resource where {
values ?input { "Alicia Keys"@en }
?resource rdfs:label ?input .
}