如何在执行查询后在SPARQL中打印检索到的语句

时间:2014-01-09 19:39:37

标签: java sparql sesame

我是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)

根据输出,它没有显示主题和对象。我的问题是:如何打印查询结果,如上所示。此代码是解析查询以便稍后打印语句的正确方法吗?非常感谢您的帮助。

1 个答案:

答案 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