2016-07-27 16 views
1

我是SPARQL和Jena中的新成員。在這裏,我使用耶拿版本2.13。我想從REGEX邊界(\b)的Java web應用程序執行SPARQL查詢。我正在使用REGEX邊界來匹配並找到確切的單詞。SPARQL查詢在Java中的REGEX邊界返回空

我對protege也運行同樣的SPARQL查詢。

這裏我SPARQL查詢在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是字符串variabel存儲用戶輸入,它接受作爲參數。

當我執行查詢時,Jena返回一個空集(甚至不是空指針異常),而Protégé返回/找到正確的結果。 我不知道如果問題是與REGEX代碼或什麼。

我想知道爲什麼我的REGEX工作不正常?任何人都可以幫我嗎?

謝謝。

回答

2

您需要\\\\W - 是的,4。 Java的一個級別是將\\W轉換爲SPARQL,下一級別是SPARQL字符串,以完全保留\W

1

SPARQL正則表達式中不包含詞邊界(與XPath flavor相同)。也許Protégé支持它們作爲擴展,但是Jena不支持。嘗試使用(^|\W)(\W|$)代替:

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

額外的反斜線在那裏,因爲字符串有逃逸的兩層:Java字符串字面,那麼SPARQL解釋。

+0

謝謝。我試過你的建議,但結果是錯誤的。 com.hp.hpl.jena.query.QueryParseException:第1行第608列出現詞法錯誤。遇到:「W」(87),在:「\」(^ | \\。任何想法? – Jeje

+0

我沒有知道,'\ W' *是*支持。也許是一個轉義問題?嘗試使用不同的引號('''而不是'\「')。 –

+0

我也試過,'+」FILTER正則表達式(str(?FoodAndBeverages) ,'(^ | \\ w)「+ Spertanyaan2fix +」(\\ w | $)')}「',結果仍然是錯誤:第1行,第608列出現詞法錯誤。遇到:」W「(87),之後:「\'(^ | \\」,另一個建議? – Jeje