解析SPARQL查询

2024-09-24 22:23:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要测试几百万个SPARQL查询的某个结构属性,为此我需要WHERE语句的结构。但不幸的是,目前ZZM并不是很有用。解析查询很容易,问题是我无法恢复语句的结构。例如:

>>> 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或{}包中找不到它。在

谢谢


Tags: fromimporttrue属性parse语句where结构
2条回答

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

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

另一个工具是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-query4s-query(非常详细)的命令,在那里可以看到查询是如何执行的以及如何为每个三重模式求值执行替换的输出。在

相关问题 更多 >