2011-08-08 55 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