任何简单的方法在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();
}