SPARQL 查询 REGEX 边界在 java returns 空

SPARQL query REGEX boundary in java returns empty

我是 SPARQL 和 Jena 的新手。我在这里使用 Jena 2.13 版。我想从 java 具有 REGEX 边界 (\b) 的 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 returns 是一个空集(甚至没有空指针异常),而 Protégé return/find 是正确的结果。 不知道是REGEX代码的问题还是什么。

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

谢谢。

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

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

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

您需要 \\W - 是的,4 个。一级用于 Java 将 \W 放入 SPARQL,下一级是 SPARQL 字符串以准确保留 \W.