【问题标题】:What flavor of regex should be used with DBpedia/Virtuoso SPARQL?DBpedia/Virtuoso SPARQL 应该使用什么风格的正则表达式?
【发布时间】:2016-11-05 11:17:34
【问题描述】:

我正在尝试使用 FILTER 仅匹配完整字符串,而不是 sparql 中的子字符串。

我正在查询DBPedia(托管在Virtuoso)。

我不太确定 SPARQL 是否支持 wordbounds,看看如何使用类似的东西

FILTER(regex(?name, "V", "i"))

将找到包含 V、IV、VI、VII 等的那些。

现在,我已经尝试使用

FILTER(regex(?name, "\<V\>", "i"))

在端点上产生编译错误

Virtuoso 37000 Error SP030: SPARQL compiler, line 0: Bad escape sequence in a short double-quoted string at '"\'

我也试过了

FILTER(regex(?name, "\bV\b", "i"))

虽然这个查询被接受,但它不会返回任何结果,我猜这是因为它将它作为退格而不是 wordbounds。

我试过寻找它使用的风味,我唯一发现的是它使用XQuery 1.0 and XPath 2.0 Functions and Operators

感谢您的宝贵时间!

【问题讨论】:

  • 此错误消息comes from the lexer,不是来自正则表达式引擎。所以尝试双重逃避:\\bV\\b 看看会发生什么。除此之外,风味appears to be PCRE(至少引用了这个库)。
  • 谢谢,我只是尝试双重转义,没有更多错误,但就像 \b 一样,不会返回任何结果。我去看看 PCRE,谢谢!
  • PCRE 是你能得到的最好的东西,它肯定支持\b,但也许regex 函数锚定了模式¯\_(ツ)_/¯,所以试试@ 987654333@.
  • @LucasTrzesniewski 刚刚试了一下,还是没有结果。也许 DBPedia sparql 使用了另一种风格或旧标准?既不能匹配 \b 也不能匹配 \> 似乎真的很奇怪
  • @ManuAndrei 对我来说,它适用于单词边界,请参阅select distinct ?s ?l where { ?s a dbo:SoccerClub . ?s rdfs:label ?l FILTER(LANGMATCHES(LANG(?l),'en')) FILTER(regex(str(?l), "\\bD", "i")) } LIMIT 100,它返回名称中以 d 开头的单词的足球俱乐部。

标签: regex sparql rdf


【解决方案1】:

字边界适用于\\b,请参阅

SELECT DISTINCT ?s ?l WHERE {
  ?s a <http://dbpedia.org/ontology/SoccerClub> ;
     <http://www.w3.org/2000/01/rdf-schema#label> ?l
  FILTER(LANGMATCHES(LANG(?l),'en'))
  FILTER(REGEX(STR(?l), "\\bD", "i"))
} LIMIT 100

返回英文名称中以“d”开头的单词的足球俱乐部。

ETA:Virtuoso 开发人员报告说它使用Perl Compatible Regular Expressions

【讨论】:

  • 你能详细说明一下吗?当我阅读规范时,正则表达式语法来自 XML 数据类型,我似乎无法在其中找到 \b。我认为\W 是“非单词字符”,我认为它本质上是一个单词边界。那个或 Z 代码之一(分隔符)
  • @JoshuaTaylor 这正是我在 DBpedia 上尝试的。 Virtuoso,它似乎接受\b 作为单词边界。我不是 Virtuoso 的开发人员,我不知道他们使用什么样的 REGEX 引擎。在文档中我找不到任何相关的东西。我不确定\b\W 之间的区别,但是这个查询会返回不同的结果:SELECT DISTINCT ?s ?l WHERE { ?s a &lt;http://dbpedia.org/ontology/SoccerClub&gt; ; &lt;http://www.w3.org/2000/01/rdf-schema#label&gt; ?l FILTER(LANGMATCHES(LANG(?l),'en')) FILTER(REGEX(STR(?l), "\\bDundee", "i")) } LIMIT 100
  • \b 以“Dundee”开头的标签也会返回(例如"Dundee F.C."@en),\W 它只返回( 之后的标签,即看起来至少然后需要一个字符:"Strathmore F.C. (Dundee)"@en
  • 我现在询问了 Virtuoso 开发人员,以获得有关实施 REGEX 风格的说明。得到答复后,我会通知您。
  • 哦,我并不担心它是否适用于 virtuoso,但我只是不知道规范中的哪个地方说 '\' 应该起作用。这可能是我的一个缺点,也可能是 virtuoso 的实现偏离标准的另一个地方。我只是想弄清楚是哪个。
【解决方案2】:

SPARQL 1.1 的 regex 函数在标准的17.4.3.14 REGEX 中有描述:

调用 XPath fn:matches 函数将文本与正则表达式模式匹配。正则表达式语言在 XQuery 1.0 和 XPath 2.0 函数和运算符部分 7.6.1 Regular Expression Syntax 中定义。

通过一些链接,您将看到正则表达式的 XML Schema 定义,地址为Appexndix F: Regular Expressions。如果您在该文档中查找 Multi-Character Escape,您会发现:

  • \w [#x0000-#x10FFFF]-[\p{P}\p{Z}\p{C}](除了集合之外的所有字符 “标点符号”、“分隔符”和“其他”字符)
  • \W
    [^\w]

当我阅读时,我认为 \W 是您正在寻找的单词分隔符。

【讨论】:

    猜你喜欢
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2021-07-16
    • 1970-01-01
    • 2011-04-17
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多