У меня есть запрос 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 пуст еще есть один результат ...
Я не удивлюсь, если это дубликат некоторые существующие вопросы и ответы, но после того, как я немного искал, я не нахожу его. –