【发布时间】: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