解析SPARQL查询

时间:2011-08-08 16:03:05

标签: python parsing grammar bison sparql

我需要测试几百万个SPARQL查询的某个结构属性,为此我需要WHERE语句的结构。我目前正在尝试使用fyzz来做到这一点,但遗憾的是它的文档并不是很有用。解析查询很容易,问题是我无法恢复语句的结构。例如:

>>> 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包中找不到它。

由于

2 个答案:

答案 0 :(得分: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命令(非常详细),您可以在其中看到查询执行方式的输出以及每个查询的替换方式三重模式评估。

答案 1 :(得分:3)

ANTLR在这里有一个SPARQL语法:http://www.antlr.org/grammar/1200929755392/index.html

ANTLR可以生成解析代码供Python运行。