SPARQL query REGEX boundary in java returns empty

删除回忆录丶 提交于 2019-12-13 02:55:13

问题


i'm new in SPARQL and Jena. Here i'm using Jena version 2.13. I would like to perform a SPARQL query from java web application with REGEX boundary (\b). I'm using REGEX boundary to match and find exact word.

I'm running the same SPARQL query on protege too.

Here my SPARQL query in java :

                "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 is String variabel to store user input, it's received as a parameter.

When i perform the query, Jena returns an empty set (not even null pointer exception) while Protégé return/find the correct results. I don't know if the problem is with the REGEX code or what.

I was wondering why my REGEX is not working correctly ? could anyone help me?

Thanks.


回答1:


You need \\\\W - yes, 4 . One level goes for Java to get \\W into SPARQL, the next level is the SPARQL string to leave exactly \W.




回答2:


Word boundaries are not included in the SPARQL regex flavor (which is the same as XPath flavor). Perhaps Protégé supports them as an extension, but Jena doesn't. Try using (^|\W) and (\W|$) instead:

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

The extra backslashes are there because the string has two layers of escaping: the Java string literal, then the SPARQL interpreter.



来源:https://stackoverflow.com/questions/38601796/sparql-query-regex-boundary-in-java-returns-empty

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!