gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:00:48 25 4
gpt4 key购买 nike

我为 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

您可以使用公共(public)端点 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com