如何从Jena SPAQL Resultset中获取第一个元素



我对Jena模型进行了一个SPARQL查询,返回了一个结果。因为只有一个元素,所以我无法迭代,所以我如何访问该结果?我试过两个选项,但都失败了。我使用ResultSetFormatter将结果转换为JSONObject,但我发现键不是我的变量。此外,我尝试使用toList()方法将其转换为QuerySolution列表,但它返回的是空列表。有什么帮助吗?

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"
            + "WHEREn"
            + "{?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为空,但只有一个结果。。。

ResultSet默认情况下是按需生成的。您只能对它们进行一次迭代,然后结果就会被消耗掉。完成后

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

你可能无法从中得到任何结果

ResultSetFormatter.outputAsJSON(b, result);

ResultSetFormatter.toList(result);

相反,您应该使用例如复制ResultSet

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

相关内容

  • 没有找到相关文章

最新更新