树状的三元组视图并删除URI

时间:2019-05-01 10:07:13

标签: eclipse servlets jena ontology

我用Java编写了一个代码,该代码读取本体并打印三元组。该代码工作正常。我想在输出中隐藏URI并以树层次结构形式输出输出。当前,它以行显示输出。不知道我该怎么做。

Tree Form Like:

Thing
     Class
         SubClass
            Individual
              so on ...

这是ReadOntology类,我在servlet中使用该类。

public class ReadOntology {

    public static OntModel model;

    public static void run(String ontologyInFile) {

        model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, null);
        InputStream ontologyIn = FileManager.get().open(ontologyInFile);

        loadModel(model, ontologyIn);
    }

    protected static void loadModel(OntModel m, InputStream ontologyIn) {
        try {
             m.read(ontologyIn, "RDF/XML");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }

这是servlet

public class Ontology extends HttpServlet{

    OntClass ontClass = null;

    public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException
    {

        PrintWriter out = res.getWriter();
        ServletContext context = this.getServletContext();
        String fullPath = context.getRealPath("/WEB-INF/Data/taxi.owl");
        ReadOntology.run(fullPath);

        SimpleSelector selector = new SimpleSelector(null, null, (RDFNode)null);

        StmtIterator iter = ReadOntology.model.listStatements(selector);
        while(iter.hasNext()) {
           Statement stmt = iter.nextStatement();
           out.print(stmt.getSubject().toString());
           out.print(stmt.getPredicate().toString());
           out.println(stmt.getObject().toString());
        }
    }
}

1 个答案:

答案 0 :(得分:1)

迈向目标的第一步是按主题对语句进行分组,并且对于谓词仅显示本地名称:

ResIterator resIt = ReadOntology.model.listSubjects()
while (resIt.hasNext()) {
    Resource r = resIt.nextResource();
    out.println(r);
    StmtIterator iter = r.listProperties();
    while (iter.hasNext()) {
        Statement stmt = iter.nextStatement();
        out.print("   ");
        out.print(stmt.getPredicate().getLocalName());
        out.println(stmt.getObject());
    }
}

API中有许多针对ResourceModel的有用方法。

要渲染完整的类树,请使用OntModelOntClass上的方法。也许:

private void printClass(Writer out, OntClass clazz, int indentation) {
   String space = '    '.repeat(indentation);

   // print space + clazz.getLocalName()
   ...
   // iterate over clazz.listSubClasses(true)
   // and call printClass for each with indentation increased by 1
   ...
   // iterator over clazz.listInstances()
   // and print all their properties as in the
   // snippet above but with space added
}

然后在service方法中,遍历OntModel的类,对于hasSuperClass()为false的任何情况,调用printClass(out, clazz, 0)