DBpedia / Virtuoso SPARQL应该使用什么样的正则表达式?

时间:2016-11-05 11:17:35

标签: regex sparql rdf

我试图只匹配完整字符串,而不是使用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"))

虽然接受了这个查询,但它并没有返回任何结果,我想这是因为它将它作为退格而不是单词边界。

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

谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

Word界限与\\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

答案 1 :(得分:1)

SPARQL 1.1的正则表达式功能在标准的17.4.3.14 REGEX中有所描述:

  

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

根据一些链接,您最终会在Appexndix F: Regular Expressions处找到正则表达式的XML架构定义。如果您在该文档中查找多字符转义符,您将找到:

  
      
  • \瓦特   [#x0000-#x10FFFF] - [\ p {P} \ p {Z} \ p {C}](除集合外的所有字符)   &#34;标点符号&#34;,&#34;分隔符&#34;和&#34;其他&#34;人物)
  •   
  • \ W
      [^ \ W]
  •   

正如我读到的那样,我认为 \ W 是您正在寻找的单词分隔符。