2011-08-08 207 views
4

我需要測試幾百萬SPARQL查詢的特定結構屬性,爲此我需要WHERE語句的結構。我目前正在嘗試使用fyzz來做到這一點,但不幸的是它的文檔並不是非常有用。解析查詢很容易,問題是我無法恢復該語句的結構。例如:解析SPARQL查詢

>>> from fyzz import parse 
>>> a=parse("SELECT * WHERE {?x a ?y . {?x a ?z}}") 
>>> b=parse("SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}") 
>>> a.where==b.where 
True 
>>> a.where 
[(SparqlVar('x'), ('', 'a'), SparqlVar('y')), (SparqlVar('x'), ('', 'a'), SparqlVar('y'))] 

有沒有辦法收回fyzz而不只是三元實際解析樹,或其他一些工具,它會讓我做到這一點? RDFLib似乎在過去擁有野牛SPARQL解析器,但我無法在rdflibrdfextras.sparql包中找到它。

感謝

回答

5

另一個工具是roqet一個工具,打包在rasqal內。它是一個返回解析樹的命令行工具。例如:

roqet -i laqrs -d structure -n -e "SELECT * WHERE {?x a ?y OPTIONAL {?x a ?z}}"

將輸出..

Query: 
query verb: SELECT 
query bound variables (3): x, y, z 
query Group graph pattern[0] { 
    sub-graph patterns (2) { 
    Basic graph pattern[1] #0 { 
     triples { 
     triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(y)) } 
     } 
    } 
    Optional graph pattern[2] #1 { 
     sub-graph patterns (1) { 
     Basic graph pattern[3] #0 { 
      triples { 
      triple #0 { triple(variable(x), uri<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>, variable(z)) } 
      } 
     } 
     } 
    } 
    } 
} 

綜觀對方的回答,我不認爲你對此有何評論是什麼喲需要。我認爲你不會在SPARQL解析器中找到答案。查詢中的對象(或三元模式)評估在Query Engines內發生,在設計良好的系統中,它與查詢解析分離。

例如,在4store你可以看看4s-query命令和選項-vvv(非常詳細),您將看到的是如何執行查詢以及如何替換每個三重模式的評價進行輸出。

+0

我知道他們是,我需要的是傳遞給查詢引擎的對象樹。基本上,我需要做的是檢查表單(P1可選P2)的每個子模式P'是否在P1中發生在P2和外部P'中的每個變量。鑑於此,我需要將某些重寫規則應用於原始模式,並且因爲具有對象樹將非常有用。 – ailnlv

3

ANTLR這裏有一個SPARQL語法:http://www.antlr.org/grammar/1200929755392/index.html

ANTLR可以解析生成的Python運行代碼。

+0

謝謝,但我需要的是比這更復雜;我需要通過查詢引擎來獲取要通過數據庫進行評估的對象,而不需要像';'這樣的簡寫。這必須已經在某個地方完成了,我想避免預處理分析樹的工作。 – ailnlv