2014-08-27 1 views
0

У меня есть запрос SPARQL по модели Jena, возвращающий единственный результат. Как я могу получить доступ к этому результату, потому что я не могу выполнять итерацию, потому что только один элемент? Я попробовал 2 варианта, но все не удалось. Я использовал ResultSetFormatter для преобразования результата в JSONObject, но я обнаружил, что ключи не являются моими переменными. Более того, я попытался преобразовать его в список QuerySolution с помощью метода toList(), но он возвращает пустой список. Любая помощь?Как получить первый элемент из Jena SPAQL Resultset

public void insertMedcationContext(JSONObject medcontext) { 

    connection.getDataset().begin(ReadWrite.WRITE); 
    Model model = connection.getDataset().getDefaultModel(); 

    String medActivityQuery = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" 
      + "PREFIX fn: <http://www.w3.org/2005/xpath-functions#>\n" 
      + "PREFIX medication:<http://www.cs.kaist.ac.kr/medication/ontology#>\n" 
      + "PREFIX resource:<http://www.cs.kaist.ac.kr/medication/resource#>\n" 
      + "PREFIX time:<http://www.w3.org/2006/time#>\n" 
      + "SELECT ?activity ((?deschour - ?timestamp) AS ?gap) (fn:abs(?gap)AS ?gapabsolute)\n" 
      + "WHERE\n" 
      + "{?activity rdf:type medication:MedicationActivity .\n"    
      + "?activity medication:belongsTo ?schedule .\n" 
      + "?activity medication:expectedTime ?time .\n" 
      + "?time time:hasTimeDescription ?desc .\n" 
      + "?desc time:year ?descyear .\n" 
      + "?desc time:month ?descmonth .\n" 
      + "?desc time:day ?descdate .\n" 
      + "?desc time:hour ?deschour .\n" 
      + "}\n" 
      + "ORDER BY (?gapabsolute)\n" 
      + "LIMIT 1";    

    try { 
     Resource schedule = model.createResource(
       nameSpace + medcontext.getString("schedule"), 
       MEDICATION.Schedule); 
     Resource scheduleResource = model.getResource(schedule.getURI()); 

     ParameterizedSparqlString parameterizedQuery = new ParameterizedSparqlString(
       medActivityQuery); 
     parameterizedQuery.setParam("schedule", scheduleResource); 

     JSONObject timestamp = new JSONObject(); 
     timestamp = medcontext.getJSONObject("exacttime"); 
     parameterizedQuery.setLiteral("descyear",Integer.toString(timestamp.getInt("year")),XSDDatatype.XSDgYear); 
     parameterizedQuery.setLiteral("descmonth",Integer.toString(timestamp.getInt("month")),XSDDatatype.XSDgMonth); 
     parameterizedQuery.setLiteral("descdate",Integer.toString(timestamp.getInt("date")),XSDDatatype.XSDgDay); 
     parameterizedQuery.setLiteral("timestamp",Integer.toString(timestamp.getInt("hour")),XSDDatatype.XSDnonNegativeInteger); 

     Query query = QueryFactory.create(parameterizedQuery.toString()); 
     QueryExecution qe = QueryExecutionFactory.create(query, model); 

     try { 
      ResultSet result = qe.execSelect(); 
      String text = ResultSetFormatter.asText(result); 
      System.out.println(text); 

      ByteArrayOutputStream b = new ByteArrayOutputStream(); 
      ResultSetFormatter.outputAsJSON(b, result); 
      JSONObject jsonResult = new JSONObject (b.toString()); 

      System.out.print(jsonResult); 

      List <QuerySolution> resultList = ResultSetFormatter.toList(result);     

      // Get the right medication activity from the model for which context is incoming 
       Resource rightActivity = null; 

       QuerySolution row = resultList.get(0); 
       rightActivity = row.getResource("activity"); 
       System.out.print(rightActivity.toString()); 

resultList пуст еще есть один результат ...

ответ

3

ResultSets являются, по умолчанию, производится по требованию. Вы можете прокручивать их только один раз, а затем результаты уничтожаются. После того, как вы

ResultSet result = qe.execSelect(); 
String text = ResultSetFormatter.asText(result); 

вы, вероятно, не может получить никаких результатов от выполнения

ResultSetFormatter.outputAsJSON(b, result); 

или

ResultSetFormatter.toList(result); 

Вместо этого, вы должны скопировать ResultSet с, например,

ResultSet results = ResultSetFactory.copyResults(qe.execSelect()); 
+1

Я не удивлюсь, если это дубликат некоторые существующие вопросы и ответы, но после того, как я немного искал, я не нахожу его. –