SPARQL 查询 REGEX 边界在 java returns 空
SPARQL query REGEX boundary in java returns empty
我是 SPARQL 和 Jena 的新手。我在这里使用 Jena 2.13 版。我想从 java 具有 REGEX 边界 (\b)
的 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 returns 是一个空集(甚至没有空指针异常),而 Protégé return/find 是正确的结果。
不知道是REGEX代码的问题还是什么。
我想知道为什么我的 REGEX 不能正常工作?谁能帮帮我?
谢谢。
单词边界不包含在 SPARQL 正则表达式风格中(与 XPath flavor 相同)。也许 Protégé 支持它们作为扩展,但 Jena 不支持。尝试使用 (^|\W)
和 (\W|$)
代替:
+ "FILTER regex(str(?FoodAndBeverages), \"(^|\\W)" + recipe + "(\\W|$)\")}"
有额外的反斜杠是因为字符串有两层转义:Java 字符串文字,然后是 SPARQL 解释器。
您需要 \\W
- 是的,4 个。一级用于 Java 将 \W
放入 SPARQL,下一级是 SPARQL 字符串以准确保留 \W
.
我是 SPARQL 和 Jena 的新手。我在这里使用 Jena 2.13 版。我想从 java 具有 REGEX 边界 (\b)
的 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 returns 是一个空集(甚至没有空指针异常),而 Protégé return/find 是正确的结果。 不知道是REGEX代码的问题还是什么。
我想知道为什么我的 REGEX 不能正常工作?谁能帮帮我?
谢谢。
单词边界不包含在 SPARQL 正则表达式风格中(与 XPath flavor 相同)。也许 Protégé 支持它们作为扩展,但 Jena 不支持。尝试使用 (^|\W)
和 (\W|$)
代替:
+ "FILTER regex(str(?FoodAndBeverages), \"(^|\\W)" + recipe + "(\\W|$)\")}"
有额外的反斜杠是因为字符串有两层转义:Java 字符串文字,然后是 SPARQL 解释器。
您需要 \\W
- 是的,4 个。一级用于 Java 将 \W
放入 SPARQL,下一级是 SPARQL 字符串以准确保留 \W
.