regex - 如何使我的sparql查询与正则表达式更快?

标签 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进行尝试,然后看到您必须等待几秒钟。

即使最终质量不是很好,我是否有办法获得更好的性能?

谢谢,
塞缪尔

最佳答案

除非您的查询限制在数据集中足够小的部分,否则使用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


该查询几乎立即运行

关于regex - 如何使我的sparql查询与正则表达式更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572915/

相关文章:

java - 这个正则表达式在 Java 中是什么意思?

c++ - 如何在不结束螺旋而不是盘旋的情况下提高 Sprite 速度

java - 为高性能数据结构定义一组基本规则 (java)

nlp - 自然语言到 Sparql

sql - SPARQL 中的字符串匹配?

replace - SPARQL 1.1 : how to use the replace function?

Java正则表达式字符串匹配

c# - ListDirectoryDe​​tails 行上的正则表达式

regex - 如何忽略所有子文件夹而不是文件夹中的文件?

android - 如何在 Canvas 上绘制大量矩形并且性能良好?