Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于Java代码的SPARQL解析器_Java_Sparql - Fatal编程技术网

用于Java代码的SPARQL解析器

用于Java代码的SPARQL解析器,java,sparql,Java,Sparql,是否有任何简单的方法可以解析java变量中的sparql查询,比如python中的Fyzz?如何使用Jena或sesame API?您可以非常简单地使用ApacheJena的语法或代数级别在java中解析和操作SPARQLQueryFactory.create(queryString)将提供查询的java表示。然后四处看看: Query query = QueryFactory.create(queryString); query.isSelectType() && query.

是否有任何简单的方法可以解析java变量中的sparql查询,比如python中的Fyzz?如何使用Jena或sesame API?

您可以非常简单地使用ApacheJena的语法或代数级别在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
(见附件)


试着从教程开始。这将让您了解查询是如何表示的,以及如何从查询中提取内容(
访问者
特别有用)。虽然最初语法级别是最熟悉的,但对于许多任务来说,语法级别工作得更好,因为它与查询的实际功能相对应。

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

要分析:

ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, queryString);
它的输出是一个
ParsedQuery
,它是查询的代数对象表示。如果您希望具体获取解析树本身,也可以:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString);
然后,您可以通过实现自定义(提示:extend
ASTVisitorBase
直接操作此抽象语法树,因此您只需覆盖实际需要执行操作的方法)

如果我们回到代数模型,您可以在Sesame Sail存储库上执行
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 myVisitor = new MyCustomQueryModelVisitor();
pq.getTupleExpr().visit(myVisitor);
有了这样一个定制的查询模型访问者,您就可以完全控制查询,优化查询,甚至重写为不同的语法

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

另外,上述解析和执行查询的方法是一种迂回的方法。如果在执行前不需要操作已解析的查询,只需在存储库上准备并执行查询,如下所示:

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

我用字符串sparql=“SELECT?a?b?c WHERE{?a?b.?a?c.}”启动main;Query=QueryFactory.create(sparql);但是我在com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:68)com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:28)com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)com.hp.hpl.jena.query.query.QueryFactory.create(QueryFactory.java:40)的线程“main”java.lang.NoClassDefFoundError中得到了异常消息在testsparql.main(testsparql.java:13)中,类路径上需要jena arq和jena核心库。我怀疑你错过了后者。哦,还有jena iri iirc。(如果可能,使用依赖关系管理器)我使用eclipse。。。我使用了这些外部JAR,但仍然会在com.hp.hpl.jena.query.ARQ(ARQ.java:53)的com.hp.hpl.jena.query.query(query.java:63)的com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:78)的com.hp.hpl.jena.query.query.QueryFactory.create(QueryFactory.QueryFactory.java:52)上发现错误ava.lang.NoClassDefFoundError.org/slf4j/LoggerFactory在testsparql.main(testsparql.java:14)的com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)上,由于:java.lang.ClassNotFoundException:org.slf4j.loggerfactory,我强烈建议花一些时间学习如何正确设置Eclipse项目和java类路径的概念。我的建议是不要手动管理依赖关系(因为它很容易出错)。有很多好的例子可以学习,让你快速开始。