解析SPARQL查询

ail*_*nlv 4 python grammar parsing sparql bison

我需要测试几百万个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'))]
Run Code Online (Sandbox Code Playgroud)

有没有办法恢复fyzz中的实际解析树而不仅仅是三元组,或者其他一些可以让我这样做的工具?RDFLib似乎已经过去野牛SPARQL解析器,但我找不到它rdflibrdfextras.sparql包.

谢谢

Man*_*res 5

另一个工具是roqetrasqal中打包的工具.它是一个返回已解析树的命令行工具.例如:

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)) }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在另一个答案中查看你的评论我不认为这是你需要的.而且我认为你不会在SPARQL解析器中找到答案.查询中的对象(或三重模式)评估发生在内部Query Engines,在设计良好的系统中,它与查询解析隔离开来.

例如,在4store中,您可以4s-query使用选项-vvv(非常详细)查看命令,您可以在其中查看执行查询的输出以及如何为每个三元模式评估执行替换.