0

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

1 回答 1

3

因为 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 .
}
于 2014-09-10T04:21:54.167 回答