SPARQL解析器的Java代码(SPARQL parser for Java Code)

2019-07-18 16:01发布

任何简单的方法在python解析为Java变量SPARQL查询,像Fyzz? 怎样才能被用来耶拿或芝麻的API?

Answer 1:

您可以解析和使用Apache耶拿在Java中操纵SPARQL ARQ很简单,无论是在语法或代数水平。 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

(见查询Java文档 )

试着开始与教程“使用ARQ操纵SPARQL” 。 这会给你的查询是如何表示的感觉,怎么拉出来的东西从他们( visitors特别有用)。 虽然最初的语法水平是最熟悉的,对于许多任务的代数工作得更好,因为它对应于什么样的查询实际上做。



Answer 2:

这里是你如何分析和操作使用芝麻一个SPARQL查询:

解析:

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

的这个输出是一个ParsedQuery ,这是对查询的代数对象表示。 如果你希望得到明确的解析树本身,这也是可能的:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString);

您可以然后直接通过实现自定义操作这个抽象语法树SyntaxTreeBuilderVisitor (:延长烙铁头ASTVisitorBase所以你只需要覆盖的方法,你真正想要做的事)。

如果我们回到代数模型,你可以执行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实现,如自己的自定义查询操盘:

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

有了这样一个自定义查询模型游客必须在查询完全控制,优化,或确实改写成不同的语法。

无论是在抽象语法树(AST)的水平,做到这一点的操作,或者在查询模型的水平是一个品味的问题:查询模式,给你更多flexbility查询规划/优化和部分重写的条款(后执行对芝麻店),而如果你的目标是完全重写用于其他目的的查询(例如执行它在非芝麻店),操纵语法树直接可能会更容易。

顺便说一句,来解析和执行查询上面的方法是做事情的一种迂回的方式。 如果您不需要在执行前操纵解析的查询,你可以简单地准备和上像这样的存储库执行查询:

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


文章来源: SPARQL parser for Java Code
标签: java sparql