Java代码的SPARQL解析器

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

您可以在语法或代数级别使用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 

(参见Query java文档 )

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

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

解析:

 ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, queryString); 

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

 ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString); 

然后,您可以通过实现自定义的SyntaxTreeBuilderVisitor直接操作此抽象语法树(提示:扩展ASTVisitorBase这样您只需要覆盖实际想要执行某些操作的方法)。

如果我们回到代数模型,你可以在Sesame Sail Repository上执行ParsedQuery

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

要在执行ParsedQuery之前操作它,请使用QueryModelVisitor实现,例如您自己的自定义查询操作ParsedQuery

 QueryModelVisitor myVisitor = new MyCustomQueryModelVisitor(); pq.getTupleExpr().visit(myVisitor); 

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

是否在抽象语法树(AST)级别或在查询模型级别执行此操作是一个品味问题:查询模型在查询规划/优化和部分重写方面为您提供更多灵活性(以后在Sesame商店上执行),如果你的目标是为了另一个目的完全重写查询(例如在非Sesame商店上执行它),直接操作语法树可能会更容易。

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

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