繁体   English   中英

SPARQL如何处理不同的条件查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM