SPARQL如何处理不同的套管查询?

时间:2014-09-09 21:27:04

标签: nlp sparql wikipedia dbpedia sparqlwrapper

我对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"""

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