java中的SPARQL查询REGEX边界返回空



我是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不能正常工作?有人能帮我吗?

谢谢。

您需要\\W-是的,4。Java的一个级别是将\W放入SPARQL,下一个级别则是将SPARQL字符串完全保留为W

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

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

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

最新更新