QuerySolution,保留“<>”

QuerySolution, keep the "< >"

我目前正忙于创建 Fuseki 三重商店浏览器的项目。我需要可视化 TripleStore 中的所有数据并使应用程序可浏览。唯一的问题是 QuerySolution 遗漏了三元组中的“< >”。

如果我使用 ResultSetFormatter.asText(ResultSet) 它 returns 这个:

-------------------------------------------------------------------------------------------------------------------------------------
| subject                    | predicate                                         | object                                           |
=====================================================================================================================================
| <urn:animals:data>         | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq> |
| <urn:animals:data>         | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_1>   | <urn:animals:lion>                               |
| <urn:animals:data>         | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_2>   | <urn:animals:tarantula>                          |
| <urn:animals:data>         | <http://www.w3.org/1999/02/22-rdf-syntax-ns#_3>   | <urn:animals:hippopotamus>                       |
-------------------------------------------------------------------------------------------------------------------------------------

请注意,某些数据包含 smaller/greater 而不是符号“<”和“>”。一旦我尝试从 ResultSet 解析数据,它就会删除这些符号,因此数据如下所示:

-------------------------------------------------------------------------------------------------------------------------------
| subject                  | predicate                                       | object                                         |
===============================================================================================================================
| urn:animals:data         | http://www.w3.org/1999/02/22-rdf-syntax-ns#type | http://www.w3.org/1999/02/22-rdf-syntax-ns#Seq |
| urn:animals:data         | http://www.w3.org/1999/02/22-rdf-syntax-ns#_1   | urn:animals:lion                               |
| urn:animals:data         | http://www.w3.org/1999/02/22-rdf-syntax-ns#_2   | urn:animals:tarantula                          |
| urn:animals:data         | http://www.w3.org/1999/02/22-rdf-syntax-ns#_3   | urn:animals:hippopotamus                       |

如您所见,数据不包含“<”和“>”符号。

这是我从 ResultSet 中解析数据的方式:

while (rs.hasNext()) {
            // Moves onto the next result
            QuerySolution sol = rs.next();
            // Return the value of the named variable in this binding.
            // A return of null indicates that the variable is not present in
            // this solution        
            RDFNode object = sol.get("object");
            RDFNode predicate = sol.get("predicate");
            RDFNode subject = sol.get("subject");


            // Fill the table with the data
            DefaultTableModel modelTable = (DefaultTableModel) this.getModel();
            modelTable.addRow(new Object[] { subject, predicate, object });
        }

这个问题比较难解释,有没有办法在解析数据后保留“<>”符号?

格式化程序使用“<>”来指示该值是 URI 而不是字符串:因此 "http://example.com/" 是文字文本值,而 <http://example.com/> 是 URI。

你也可以自己做同样的事情:

RDFNode node; // subject, predicate, or object    

if (node.isURIResource()) {
    return "<" + node.asResource().getURI() + ">";
} else {
    ...
}

但是用起来更方便FmtUtils:

String nodeAsString = FmtUtils.stringForRDFNode(subject); // or predicate, or object

您需要做的是在呈现 table 单元格时调用该代码:当前 table 正在使用 Object::toString().

概括地说,需要的步骤是:

modelTable.setDefaultRenderer(RDFNode.class, new MyRDFNodeRenderer());

然后查看 http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#renderer 如何创建简单的渲染器。请注意 value 将是 RDFNode:

static class MyRDFNodeRenderer extends DefaultTableCellRenderer {

    public MyRDFNodeRenderer() { super(); }

    public void setValue(Object value) {
        setText((value == null) ? "" : FmtUtils.stringForRDFNode((RDFNode) value));
    }
}