3

我已经为 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尝试它,然后看到您必须等待几秒钟。

有没有办法让我在这方面获得更好的表现,即使最终质量不太好?

谢谢,塞缪尔

4

1 回答 1

8

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

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

解决方案 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

此查询几乎立即运行

于 2012-11-27T17:47:51.913 回答