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

Java 如何从Jena SPAQL Resultset获取第一个元素,java,sparql,resultset,jena,Java,Sparql,Resultset,Jena,我有一个对Jena模型的SPARQL查询,返回一个结果。由于只有一个元素而无法迭代,如何访问该结果?我尝试了两种选择,但都失败了。我使用ResultSetFormatter将结果转换为JSONObject,但我发现键不是我的变量。此外,我尝试使用toList()方法将其转换为QuerySolution列表,但它返回的是空列表。有什么帮助吗 public void insertMedcationContext(JSONObject medcontext) { connection.get

我有一个对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"
            + "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());
public void insertMedcationContext(JSONObject-medcontext){
connection.getDataset().begin(ReadWrite.WRITE);
模型模型=connection.getDataset().getDefaultModel();
字符串medActivityQuery=“前缀rdf:\n”
+“前缀fn:\n”
+“前缀:\n”
+“前缀资源:\n”
+“前缀时间:\n”
+“选择活动(?描述小时-?时间戳)作为间隙)(fn:abs(?间隙)作为间隙溶质)\n”
+“其中\n”
+“{?活动rdf:类型药物:药物活动。\n”
+“?活动药物:属于计划。\n”
+“?活动药物:预期时间?时间。\n”
+“?时间:说明?说明。\n”
+“?描述时间:年?描述年。\n”
+“?描述时间:月?描述月。\n”
+“?描述时间:天?描述日期。\n”
+“?描述时间:小时?描述小时。\n”
+“}\n”
+“按(?gapabsolute)排序\n”
+“限制1”;
试一试{
资源计划=model.createResource(
nameSpace+medcontext.getString(“计划”),
药物治疗(时间表);
Resource scheduleResource=model.getResource(schedule.getURI());
ParameterizedSparqlString parameterizedQuery=新的ParameterizedSparqlString(
医疗活动查询);
setParam(“schedule”,scheduleResource);
JSONObject timestamp=新的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(“日期”)),XSDDatatype.XSDgDay);
parameterizedQuery.setLiteral(“timestamp”)、Integer.toString(timestamp.getInt(“hour”)、XSDDatatype.XSDnonNegativeInteger);
Query Query=QueryFactory.create(parameteredQuery.toString());
QueryExecution qe=QueryExecutionFactory.create(查询,模型);
试一试{
ResultSet result=qe.execSelect();
String text=ResultSetFormatter.asText(结果);
System.out.println(文本);
ByteArrayOutputStream b=新的ByteArrayOutputStream();
结果格式输出(b,结果);
JSONObject jsonResult=新的JSONObject(b.toString());
系统输出打印(jsonResult);
List resultList=ResultSetFormatter.toList(结果);
//从传入上下文的模型中获取正确的药物治疗活动
资源rightActivity=null;
QuerySolution行=resultList.get(0);
rightActivity=row.getResource(“活动”);
System.out.print(rightActivity.toString());

resultList为空,但有一个结果…

默认情况下,ResultSet是按需生成的。您只能对它们迭代一次,然后使用结果。执行此操作后

ResultSet result = qe.execSelect();
String text = ResultSetFormatter.asText(result);
你可能无法从中得到任何结果

ResultSetFormatter.outputAsJSON(b, result);

相反,您应该使用复制结果集,例如

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

默认情况下,结果集是按需生成的。您只能对它们进行一次迭代,然后使用结果。之后

ResultSet result = qe.execSelect();
String text = ResultSetFormatter.asText(result);
你可能无法从中得到任何结果

ResultSetFormatter.outputAsJSON(b, result);

相反,您应该使用复制结果集,例如

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

默认情况下,结果集是按需生成的。您只能对它们进行一次迭代,然后使用结果。之后

ResultSet result = qe.execSelect();
String text = ResultSetFormatter.asText(result);
你可能无法从中得到任何结果

ResultSetFormatter.outputAsJSON(b, result);

相反,您应该使用复制结果集,例如

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

默认情况下,结果集是按需生成的。您只能对它们进行一次迭代,然后使用结果。之后

ResultSet result = qe.execSelect();
String text = ResultSetFormatter.asText(result);
你可能无法从中得到任何结果

ResultSetFormatter.outputAsJSON(b, result);

相反,您应该使用复制结果集,例如

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

如果这是某个现有问题和答案的副本,我不会感到惊讶,但经过一点搜索,我没有找到。如果这是某个现有问题和答案的副本,我不会感到惊讶,但经过一点搜索,我没有找到。如果这是某个现有问题和答案的副本,我不会感到惊讶回答,但是在我搜索了一点之后,我没有找到一个。如果这是一些现有问题和答案的重复,我不会感到惊讶,但是在我搜索了一点之后,我没有找到一个。