Netbeans中Jena SPARQL多列查询结果绑定JTable无数据问题
问题根因
Jena 的 com.hp.hpl.jena.query.ResultSet 是仅支持单次遍历的迭代器结构,你代码中先调用 ResultSetFormatter.out(results) 向控制台输出结果时,已经完整遍历过一次结果集,后续调用 buildTableModel(results) 时结果集已经耗尽,rs.hasNext() 会直接返回 false,因此无法读取到行数据。
解决方案
方案1:移除冗余的结果集输出代码
直接删除 ResultSetFormatter.out(results); 这行代码即可,避免提前消耗结果集,修改后的执行逻辑如下:
private void btnExecuteSPARQLActionPerformed(java.awt.event.ActionEvent evt) { try { System.out.println("Executing SPARQL..."); String queryString; queryString = "PREFIX ssuet:<http://www.semanticweb.org/alinaanjum2/ontologies/2021/6/untitled-ontology-4#> " + txtQuery.getText(); com.hp.hpl.jena.query.ResultSet results = OpenOWL.ExecSparQl(queryString); // 移除ResultSetFormatter.out(results)避免提前遍历结果集 JTable table = new JTable(buildTableModel(results)); JOptionPane.showMessageDialog(null, new JScrollPane(table)); } catch (Exception ex) { System.out.println(ex); } }
方案2:保留控制台输出的兼容方案
如果需要保留控制台打印结果的逻辑,可先将结果集转换为支持重复遍历的 ResultSetRewindable 类型:
private void btnExecuteSPARQLActionPerformed(java.awt.event.ActionEvent evt) { try { System.out.println("Executing SPARQL..."); String queryString; queryString = "PREFIX ssuet:<http://www.semanticweb.org/alinaanjum2/ontologies/2021/6/untitled-ontology-4#> " + txtQuery.getText(); com.hp.hpl.jena.query.ResultSet results = OpenOWL.ExecSparQl(queryString); // 转换为可重复遍历的结果集 ResultSetRewindable rsRewind = ResultSetFactory.makeRewindable(results); // 先输出到控制台 ResultSetFormatter.out(rsRewind); // 重置结果集指针到起始位置 rsRewind.reset(); JTable table = new JTable(buildTableModel(rsRewind)); JOptionPane.showMessageDialog(null, new JScrollPane(table)); } catch (Exception ex) { System.out.println(ex); } }
额外优化建议
当前代码中直接调用 sol.getLiteral(columnName) 取值,如果查询返回的字段不是字面量类型(比如URI资源、空白节点)会触发空指针异常,建议修改取值逻辑兼容所有类型:
while (rs.hasNext()) { QuerySolution sol = rs.nextSolution(); Vector<Object> vector = new Vector<Object>(); for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { String columnName = columnNames.get(columnIndex); RDFNode node = sol.get(columnName); vector.add(node != null ? node.toString() : ""); } data.add(vector); }
内容的提问来源于stack exchange,提问作者Alina Anjum
相关产品推荐
相关产品推荐

