我是Java Sesame和SPARQL的新手。我已经在Sesame存储库中添加了语句,现在我正在尝试检索一些语句并简单地打印它们。根据我的理解,我需要解析查询以打印检索到的语句。下面的代码显示了我到目前为止所处的位置:
String queryString = "SELECT ?subject ?object WHERE { ?subject <http://example.org/is> ?object . } LIMIT 1";
...
SPARQLParser parser = new SPARQLParser();
ParsedQuery query = parser.parseQuery(queryString, null);
StatementPatternCollector collector = new StatementPatternCollector();
query.getTupleExpr().visit(collector);
List<StatementPattern> patterns = collector.getStatementPatterns();
// To print the first statement only for example.
System.out.println(patterns.get(0));
这是输出:
StatementPattern
Var (name=name)
Var (name=-const-1, value=http://example.org/is, anonymous)
Var (name=object)
根据输出,它没有显示主题和对象。我的问题是:如何打印查询结果,如上所示。此代码是解析查询以便稍后打印语句的正确方法吗?非常感谢您的帮助。
答案 0 :(得分:2)
您可以通过评估查询来获取查询结果,而不是通过解析查询。您的代码所做的是检查查询的代数模型并从该代数中检索模式。这种方法不会给你查询结果。
在Sesame中评估查询远比这简单:
// open a connection to the Sesame repository containing your statements
RepositoryConnection conn = repository.getConnection();
try {
// create a prepared query object from your query string
TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
// evaluate the query on the repository
TupleQueryResult result = query.evaluate();
// iterate over the results and do something with each result
while (result.hasNext()) {
BindingSet s = result.next();
Value subject = s.getValue("subject");
Value object = s.getValue("object");
System.out.println("value of ?subject: " + subject);
System.out.println("value of ?object: " + object);
}
} finally {
conn.close();
}
正如Joshua指出的那样,您的查询检索变量绑定(对于SELECT子句中提到的变量),而不是RDF语句。您当然可以从Java中的那些变量绑定重新创建RDF语句,但是如果您真的想要完整语句而不仅仅是主题和对象,那么切换到使用SPARQL CONSTRUCT查询而不是SELECT查询可能更容易。
有关如何评估不同类型的查询以及如何使用Sesame中的结果的详细信息,请参阅Sesame user documentation(特别是第6.5节)和API Javadoc。