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

时间:2016-07-27 00:12:58

标签: java regex web sparql jena

我是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是用于存储用户输入的String变量,它是作为参数接收的。

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

我想知道为什么我的REGEX无法正常工作?有人可以帮帮我吗?

感谢。

2 个答案:

答案 0 :(得分:2)

你需要\\\\W - 是的,4。一个级别是Java将\\W转换为SPARQL,下一级是SPARQL字符串,以准确保留\W

答案 1 :(得分:1)

Word边界不包含在SPARQL正则表达式中(与XPath flavor相同)。也许Protégé支持他们作为延伸,但耶拿没有。请尝试使用(^|\W)(\W|$)代替:

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

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