【问题标题】:Get Multiple columns in Result Set from sparql in Netbeans JTable从 Netbeans JTable 中的 sparql 获取结果集中的多个列
【发布时间】:2021-09-16 15:15:58
【问题描述】:

我正在尝试在 Jena 结果集中选择多个列,然后将它们绑定到 Java 表。

当我只选择一列时,结果集工作正常,但当我选择两列时,结果集没有任何行,尽管它只有列:

这是我的 Java 代码:

private void btnExecuteSPARQLActionPerformed(java.awt.event.ActionEvent evt) {                                                 
        
        try 
        {           
            System.out.println("Executing SPARQL...");  // get the name list query
            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); //all method ExecSparQl from OpenOWL class
    
            ResultSetFormatter.out(results);

            // It creates and displays the table
            JTable table = new JTable(buildTableModel(results));
            JOptionPane.showMessageDialog(null, new JScrollPane(table));
        } 
        catch (Exception ex) 
        {
           System.out.println(ex);
        }
    }                                                
    
    //CODE ADDITION BY ALINA ANJUM STARTED ON 03-AUGUST-2021
   public static DefaultTableModel buildTableModel(com.hp.hpl.jena.query.ResultSet rs)
        throws SQLException {

         List<String> metaData = rs.getResultVars();

    // names of columns
    Vector<String> columnNames = new Vector<String>();
    int columnCount = metaData.size();
    
       System.out.println(columnCount);
       
    for (int column = 0; column <columnCount; column++) 
    {
        columnNames.add(metaData.get(column));
    }

    // data of the table
    Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    
    while (rs.hasNext()) 
    {
        QuerySolution sol = rs.nextSolution();     
        
        Vector<Object> vector = new Vector<Object>();
        
        for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) 
        {
            //vector.add(rs.getObject(columnIndex));
            String columnName = columnNames.get(columnIndex);   
            vector.add(sol.getLiteral(columnName).getString());
        }
        data.add(vector);
    }

    return new DefaultTableModel(data, columnNames);

}

以下查询完美返回值:

SELECT (str(?x) as ?name)
WHERE {
   ?Person ssuet:hasname ?x.
}

以下查询在 Protege 中运行良好,但在 Java 的结果集中没有返回值:

SELECT (str(?x) as ?name)
(str(?y) as ?phone)
WHERE {
   ?Person ssuet:hasname ?x.
?Person ssuet:hasPhoneNumber ?y.
}

Netbeans 中输出的屏幕截图:

protege 中第二次查询的结果:

【问题讨论】:

  • com.hp.hpl.jena.query -- 这个版本的耶拿是古老的。 Jena 目前的版本为 4.2.0。
  • 另外,你应该使用Java 11,省略Vector类,遵循你自己的命名约定并使用hasName(驼峰式风格)
  • 如果您的第二个查询没有返回任何内容,即使在 Netbeans 控制台上也不返回,那么数据与 Protege 中的数据完全不同,并且查询不匹配。你是通过文本编辑器检查的吗?或者只是通过 Jena API 打印三元组?
  • @UninformedUser 您能分享有关新版 Jena 的完整指南吗?我是新手
  • 只要使用 Apache Jena 和 Maven(文档在线),而不是像 github.com/softiecode/QueryExpansion 这样的 6 年老第 3 方项目,如果您不需要它们提供的任何功能。他们只是将本体加载到OntModel 中,然后运行查询。我建议在本机 Jena 代码上执行此操作并使用最新的 4.2.0

标签: java sparql jena protege


【解决方案1】:

ResultSets 是迭代器。

调用ResultSetFormatter.out(results) 会耗尽迭代器(不再有行)。

如果要使用两次结果,请使用ResultSetFactory.makeRewindable 获取可以重置为开始的结果集。

【讨论】:

  • 对,这两个查询都不会显示为JTable - 但是问题也是为什么第二个查询根本不显示任何结果集,即使在 CLI 上也不显示 - 请参阅第一个屏幕截图,它在 CLI 上返回一个完整的表,但只有第二个的标题
  • 感谢@AndyS,但问题出在第二个查询中。 UninformedUser 说,它甚至没有在 ResultSetFormatter 中返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多