Java代码的SPARQL解析器

Ele*_* K. 8 java sparql

有没有简单的方法来解析java变量中的sparql查询,比如python中的Fyzz?如何使用Jena或芝麻API?

use*_*512 8

您可以在语法或代数级别使用Apache Jena的ARQ简单地解析和操作Java中的SPARQL .QueryFactory.create(queryString)将提供查询的java表示.然后四处寻找:

Query query = QueryFactory.create(queryString);
query.isSelectType() && query.isQueryResultStar(); // of the form SELECT *?
query.getDatasetDescription(); // FROM / FROM NAMED bits
query.getQueryPattern(); // The meat of the query, the WHERE bit
...etc etc..
Op op = Algebra.compile(query); // Get the algebra for the query
Run Code Online (Sandbox Code Playgroud)

(参见Query java文档)

尝试从教程'使用ARQ操纵SPARQL'开始.这将让您了解如何表示查询,以及如何从中提取信息(visitors特别有用).虽然最初语法级别是最熟悉的,但对于许多任务,代数工作得更好,因为它对应于查询实际执行的操作.

  • 我强烈建议花一些时间学习如何正确设置Eclipse项目以及Java CLASSPATH的概念.我的建议是不要手动管理依赖项(因为它很容易出错).有许多好的例子可供学习,让你快速入门. (2认同)

Jee*_*tra 5

以下是使用 Sesame 解析和操作 SPARQL 查询的方法:

解析:

ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, queryString);
Run Code Online (Sandbox Code Playgroud)

这个的输出是 a ParsedQuery,它是查询的代数对象表示。如果您希望专门获取解析树本身,那也是可能的:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString);
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过实现自定义SyntaxTreeBuilderVisitor直接操作此抽象语法树(提示:扩展,ASTVisitorBase因此您只需覆盖您真正想做某事的方法)。

如果我们回到代数模型,您可以ParsedQuery在 Sesame Sail 存储库上执行:

if (pq instanceof ParsedTupleQuery) {
        SailTupleQuery query = new SailTupleQuery(pq, repositoryConnection);
        TupleQueryResult result = query.evaluate();
} else if (pq instanceof ParsedGraphQuery) {
        // etc for other query types
}
Run Code Online (Sandbox Code Playgroud)

ParsedQuery在执行之前对其进行操作,请使用QueryModelVisitor实现,例如您自己的自定义查询操作器:

QueryModelVisitor myVisitor = new MyCustomQueryModelVisitor();
pq.getTupleExpr().visit(myVisitor);
Run Code Online (Sandbox Code Playgroud)

使用这样的自定义查询模型访问者,您可以完全控制查询、优化它或实际上重写为不同的语法。

是在抽象语法树 (AST) 级别还是在查询模型级别执行此操作是一个品味问题:查询模型在查询计划/优化和部分重写方面为您提供了更大的灵活性(供以后使用)在 Sesame 商店上执行),而如果您的目标是完全重写查询以用于其他目的(例如在非芝麻商店上执行),则直接操作语法树可能更容易。

顺便说一句,上述解析和执行查询的方式是一种迂回的做事方式。如果您不需要在执行之前操作已解析的查询,您可以简单地在存储库上准备和执行查询,如下所示:

String queryString = "SELECT ...";
RepositoryConnection conn = repo.getConnection();
try {
   TupleQuery tq = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
   TupleQueryResult result = tq.evaluate();
}
finally {
   conn.close();
}
Run Code Online (Sandbox Code Playgroud)