解析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似乎以前有一个bison SPARQL解析器,但我在rdflib
或rdfextras.sparql
包中找不到它。
谢谢
3 个回答
2
试试用 rdflib.plugins.sparql.parser.parseQuery
这个方法。
3
ANTLR有一个SPARQL的语法规则,可以在这里找到:http://www.antlr.org/grammar/1200929755392/index.html
ANTLR可以生成可以在Python中运行的解析代码。
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
这个选项(非常详细),这样你就能看到查询是如何执行的,以及每个三元组模式评估时是如何进行替换的。