我是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解释器。