正则表达式的可扩展性 (MarkLogic)
Scalability of Regular Expressions (MarkLogic)
我一直在寻找在 MarkLogic 中为 XQuery 和 SPARQL 执行正则表达式的方法。但似乎对于 XQuery fn:match
是解决此问题的唯一方法。似乎还建议通过 for 循环在 运行 之前使用查询缩小数据,这可以在这个 中看到。但是,如果我无法缩小它并且需要遍历数百万数据怎么办,是否有更具可扩展性的方法来做到这一点?我不确定任务机器人是否是我应该考虑的选项。
另一方面,在 SPARQL 中有两种方法可以解决这个问题。
第一种方法
SELECT ?s ?p ?o
WHERE {?s ?p ?o
FILTER (regex (?o, ".*Name.*", "i"))
}
第二种方法
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
SELECT ?s ?p ?o
WHERE {?s ?p ?o
FILTER (fn:matches(?o, ".*Name.*"))
}
在 SPARQL 中采用的这两个选项中,它们是相同的还是其中一个略好于另一个?对于 SPARQL 和 XQuery
的任何建议或更好的方法,我也将不胜感激
基本上,您是在将搜索字符串作为 "Name"
进行子字符串匹配,为此 fn:contains 就足够了
fn:contains(?o, "Name")
一些建议:
Avoid regex if you can by replacing with simple string search filters
我曾经不得不在 Java 中使用不那么复杂的正则表达式重做整个项目,但即使是那几个环顾四周也让它变得非常慢。我不得不将这些正则表达式分解为多个级别的字符串搜索过滤器,天哪,这有什么不同。在 MarkLogic 中,fn:substring-before and fn:substring-after 等函数可以帮助您在通过字符串搜索过滤器级别时减少文本长度。
不过,如果你必须使用正则表达式并且遇到性能问题,那么除了并行计算之外,最好将正则表达式匹配的责任委托给最擅长的语言/技术,如 Perl。
我一直在寻找在 MarkLogic 中为 XQuery 和 SPARQL 执行正则表达式的方法。但似乎对于 XQuery fn:match
是解决此问题的唯一方法。似乎还建议通过 for 循环在 运行 之前使用查询缩小数据,这可以在这个
另一方面,在 SPARQL 中有两种方法可以解决这个问题。
第一种方法
SELECT ?s ?p ?o
WHERE {?s ?p ?o
FILTER (regex (?o, ".*Name.*", "i"))
}
第二种方法
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
SELECT ?s ?p ?o
WHERE {?s ?p ?o
FILTER (fn:matches(?o, ".*Name.*"))
}
在 SPARQL 中采用的这两个选项中,它们是相同的还是其中一个略好于另一个?对于 SPARQL 和 XQuery
的任何建议或更好的方法,我也将不胜感激基本上,您是在将搜索字符串作为 "Name"
进行子字符串匹配,为此 fn:contains 就足够了
fn:contains(?o, "Name")
一些建议:
Avoid regex if you can by replacing with simple string search filters
我曾经不得不在 Java 中使用不那么复杂的正则表达式重做整个项目,但即使是那几个环顾四周也让它变得非常慢。我不得不将这些正则表达式分解为多个级别的字符串搜索过滤器,天哪,这有什么不同。在 MarkLogic 中,fn:substring-before and fn:substring-after 等函数可以帮助您在通过字符串搜索过滤器级别时减少文本长度。
不过,如果你必须使用正则表达式并且遇到性能问题,那么除了并行计算之外,最好将正则表达式匹配的责任委托给最擅长的语言/技术,如 Perl。