我是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无法正常工作?有人可以帮帮我吗?
感谢。
答案 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解释器。