解析SPARQL查询

8

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

谢谢。


这件事有什么结果吗?除了“roqet”之外。 - undefined
1
实际上是的。我使用了Jena的查询引擎作为解析器,最终我们开发了一个工具来对SPARQL查询进行静态分析,并在VLDB上发表了相关论文。代码托管在这里 - undefined
非常感谢!我期待着阅读您发布的文章,谢谢! - undefined
3个回答

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解析器内找到答案。查询中的对象(或三元模式)评估发生在查询引擎内部,在设计良好的系统中,查询引擎与查询解析是隔离的。
例如,在4store中,您可以查看带有选项-vvv(非常详细)的4s-query命令,其中您将看到查询如何执行以及每个三元模式评估的替换是如何完成的。

我知道它们是什么,我需要的是传递给查询引擎的对象树。基本上,我需要做的是检查形式为(P1 OPTIONAL P2)的每个子模式P',即P2中出现并且不在P'中的每个变量也是否出现在P1中。鉴于此,我需要对原始模式应用某些重写规则,而拥有对象树将非常有用。 - ailnlv

3

谢谢,但我需要的比那复杂一些;我需要获取将在查询引擎上评估数据库的对象,而不使用 ; 等简写。这必须已经在某个地方完成,我想避免预处理解析树的工作。 - ailnlv

2
尝试使用rdflib.plugins.sparql.parser.parseQuery

这并没有回答问题。一旦你有足够的 声望,你就能够 评论任何帖子;相反,提供不需要向提问者澄清的答案。- 来自审核 - jtbandes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接