如何使用正则表达式更快地进行sparql查询?

时间:2012-11-26 20:48:17

标签: regex performance sparql dbpedia

我为dbpedia构建了一个带有正则表达式的sparql查询,速度非常慢:

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>

select ?label where {
    ?s rdfs:label ?label.
    ?s dbpedia-owl:thumbnail ?photo.
    ?s dbpedia-owl:abstract ?abstract.
    FILTER langMatches( lang(?label), "FR" ).
    FILTER langMatches( lang(?abstract), "FR" ).
    FILTER regex(?label, "^Jules V", "i").

}
LIMIT 10

您可以使用公共端点http://fr.dbpedia.org/sparql进行尝试,并且必须等待几秒钟。

即使最终质量不是很好,我还有办法在这方面取得更好的表现吗?

谢谢, 塞缪尔

1 个答案:

答案 0 :(得分:8)

使用REGEX的任何查询几乎肯定会很慢,除非您的查询限制到数据集的足够小的部分。处理REGEX基本上要求商店对潜在结果进行线性扫描,检查每个结果是否与正则表达式匹配。

如果你有一个足够简单的正则表达式,你应该尝试以下两种方法之一:

解决方案1 ​​ - 使用重量较轻的字符串函数

在你的情况下,你正在寻找以某个子字符串开头的字符串,因此使用STRSTARTS函数几乎肯定会更有效,因为这不需要完整的正则表达式。当然,这假设您的SPARQL引擎符合最新的SPARQL 1.1草案规范。

解决方案2 - 使用全文搜索

许多商店都包含全文搜索扩展程序,可用于代替REGEX,并且通常会产生明显更好的性能,因为您访问的是全文索引,而不是对潜在结果进行线性扫描。

对于DBPedia,它背后的Virtuoso商店支持以下语法:

?label bif:contains "Jules"

请注意,Virtuoso全文语法有些限制,因此您不能使用Jules V,因为每个术语必须至少包含4个字符(可能为3个字符)。但是你可以将它与另一个FILTER结合起来,以缩小到你想要的结果:

PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>

select ?label where {
    ?s rdfs:label ?label.
    ?s dbpedia-owl:thumbnail ?photo.
    ?s dbpedia-owl:abstract ?abstract.
    FILTER langMatches( lang(?label), "FR" ).
    FILTER langMatches( lang(?abstract), "FR" ).
    ?label bif:contains "Jules" .
    FILTER (CONTAINS(?label, "V"))

}
LIMIT 10

此查询几乎立即运行

相关问题