【问题标题】:SPARQL query REGEX boundary in java returns emptyjava中的SPARQL查询REGEX边界返回空
【发布时间】:2016-07-27 00:12:58
【问题描述】:

我是 SPARQL 和 Jena 的新手。这里我使用的是 Jena 2.13 版。我想从具有 REGEX 边界(\b) 的 Java Web 应用程序执行 SPARQL 查询。我正在使用 REGEX 边界来匹配并找到确切的单词。

我也在 protege 上运行相同的 SPARQL 查询。

这是我在 java 中的 SPARQL 查询:

                "PREFIX foaf: <http://xmlns.com/foaf/0.1/> "
                + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
                + "PREFIX owl: <http://www.w3.org/2002/07/owl#> "
                + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> "
                + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
                + "PREFIX : <" + CROSS_NS + "> "
                + "SELECT ((?FoodAndBeveragesRecipes) AS ?Resep)((?FoodAndBeverages) AS ?a) "
                + "WHERE{ ?FoodAndBeveragesRecipes :IngR ?_IngR."
                + " ?_IngR :HasIngredients ?FoodAndBeverages;"
                + ":UnitValue ?Value;"
                + " :MeasurementUnit ?Measurements;"
                + " :Ing_Type ?IngType." 
                + "FILTER regex(str(?FoodAndBeverages), \"\\b" + recipe + "\\b\")}"
                + " ORDER BY ?FoodAndBeveragesRecipes";

recipe 是存储用户输入的字符串变量,作为参数接收。

当我执行查询时,Jena 返回一个空集(甚至不是空指针异常),而 Protégé 返回/查找正确的结果。 不知道问题出在REGEX代码还是什么的。

我想知道为什么我的 REGEX 不能正常工作?谁能帮帮我?

谢谢。

【问题讨论】:

    标签: java regex web sparql jena


    【解决方案1】:

    你需要\\\\W - 是的,4。 Java 将\\W 导入SPARQL 的一个级别是,下一个级别是SPARQL 字符串以完全保留\W

    【讨论】:

      【解决方案2】:

      SPARQL 正则表达式风格中不包含单词边界(与XPath flavor 相同)。也许 Protégé 支持它们作为扩展,但 Jena 不支持。尝试改用(^|\W)(\W|$)

      + "FILTER regex(str(?FoodAndBeverages), \"(^|\\\\W)" + recipe + "(\\\\W|$)\")}"    
      

      额外的反斜杠是因为字符串有两层转义:Java 字符串文字,然后是 SPARQL 解释器。

      【讨论】:

      • 谢谢。我试过你的建议,但结果是错误的。 com.hp.hpl.jena.query.QueryParseException:第 1 行第 608 列出现词汇错误。遇到:“W”(87),之后:“\”(^|\\ 。知道吗?
      • 我不知道,\W 支持。也许是一个逃避问题?尝试使用不同的引号(' 而不是 \")。
      • 我也试过了,+ "FILTER regex(str(?FoodAndBeverages), '(^|\\w)" + Spertanyaan2fix + "(\\w|$)')}" ,结果仍然错误:第 1 行第 608 列出现词法错误。遇到:"W" (87),之后:"\'(^|\ \" ,另一个建议?
      • @Jere id 建议在连接所有这些 steins 后打印查询,并显示出来。当有两个级别的转义时,很难诊断转义问题。
      • 你需要\\\\W - 是的,4 \。 Java 将\\W 放入SPARQL 的一个级别,下一个级别是离开\W 的SPARQL 字符串
      猜你喜欢
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多