Python 解析SPARQL查询

Python 解析SPARQL查询,python,parsing,grammar,bison,sparql,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 OPTION

我需要测试数百万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包中找不到它


谢谢

ANTLR在这里有一个SPARQL语法:

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

另一个工具是roqet,它是一个打包在其中的工具。它是一个命令行工具,返回已解析的树。例如:

roqet-i laqrs-d结构-n-e选择*其中{?xa?y可选{?xa?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解析器中找到答案。查询中的对象或三重模式计算发生在查询引擎内部,在设计良好的系统中,查询引擎与查询解析隔离


例如,在4store中,您可以查看带有选项-vvv verybose的4s query命令,您将看到如何执行查询以及如何为每个三重模式求值执行替换的输出。

谢谢,但我需要的是比这更复杂一点;我需要通过查询引擎获取要在数据库上计算的对象,而不需要像;这样的速记;。这必须已经在某个地方完成了,我想避免预处理解析树的工作。我知道,我需要的是传递给查询引擎的对象树。基本上,我需要做的是检查P1形式的每个子模式P',可选的是P2中出现的每个变量和P'之外的每个变量也出现在P1中。鉴于此,我需要对原始模式应用某些重写规则,因此拥有对象树将非常有用。