解析SPARQL查询

8 投票
3 回答
2844 浏览
提问于 2025-04-16 23:08

我需要测试几百万个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解析器,但我在rdflibrdfextras.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 这个选项(非常详细),这样你就能看到查询是如何执行的,以及每个三元组模式评估时是如何进行替换的。

撰写回答