• jena读取owl文件的父子属性以及其他属性


    1.为了更好的使用Jena API,我们应该对OWL有个大致的了解。OWL核心是围绕三元组的,即我们在很多资料中看到的陈述(Statement),它的组成为:Statement=(Subject,Property,Object),其中Subject我们熟成为主体,Property成为属性,Object成为客体。在编程中容易让人搞混的他们和Individual的区别。Individual熟称为个体。它是Subject、Object的一个实例,例如在Statement=(Animals,Eat,Plants)陈述中sheep是Animals的一个Individual,grass是Plants的一个Individual。从这个角度上来说我们理解为什么主体、客体被说成是类(Class)。而这一切的主体、客体、个体、类、属性等我们都可以称为资源(Resource)。在编程中OWL常用的是OntModel,Ontclass,OntProperty,Individual。OntClass可以用来创建主体,客体,OntPropety用来创建属性,Individual用来创建个体。 常用的方法有CreatClass,CreatIndividual,listObjects,listObjectsofProperty,listSubjectswithProperty,listPropertyvalues等。
    我的需求很明确,就是将一个owl文件中的所有的属性名称(包括父节点、子节点)以及相对应的属性值读取出来。接下来直接上代码:

    //创建一个本体语言指定语言类型.
        OntModel ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
        try {
            ontModel.read(new FileInputStream("c:/util/owl/symp.owl"), "");
            } catch (FileNotFoundException e1) {
            e1.printStackTrace();
            }
            // 迭代显示模型中的类,在迭代过程中完成各种操作
            for (Iterator<?> i = ontModel.listClasses(); i.hasNext();) {
            <span style="white-space:pre">    </span>parentList.clear();
                OntClass c = (OntClass) i.next(); // 返回类型强制转换
                if (!c.isAnon()) {//如果不是匿名类,则打印类的名字
                    // 迭代显示当前类的直接父类
                    for (Iterator<?> it = c.listSuperClasses(); it.hasNext();){
                        OntClass sp = (OntClass) it.next();
                            //得到的id号为obo:SYMP_0000743 因此要去掉obo:因此从3开始截取
                                        parentList.add(sp.getModel().getGraph().getPrefixMapping().shortForm(sp.getURI()).substring(4));
                                     } 
                    // 迭代显示当前类的直接子类
                    for (Iterator<?> it = c.listSubClasses(); it.hasNext();) {
                        OntClass sb = (OntClass) it.next();
                                        childIdBuf.append(sb.getModel().getGraph().getPrefixMapping().shortForm(sb.getURI()).substring(4)+"~");
                    }
                    StmtIterator iterator = c.listProperties();
                    while(iterator.hasNext()){
                    <span style="white-space:pre">    </span>Statement statement = iterator.next();
                       <span style="white-space:pre">            </span>predict = statement.getPredicate().toString().substring(statement.getPredicate().toString().indexOf("#")+1);
                            //得到的数据类似encephalitis^^http://www.w3.org/2001/XMLSchema#string 因此要截取^^之前的部分
                                            //如果不是字符串类型的数据则没有^^这个符号因此符合这个规范的才进行操作
                            object = statement.getObject().toString();
    }

    这样就完成了整个的遍历过程。再找到此方法之前,自己尝试过直接使用jena自带的PersistentOntology这个类中的方法直接存入数据库,但是发现他会自动生成好多张表。而且里面有一些数据是不可解释的(可能是我没理解吧),而且属性名前面会加上前缀,不利于进一步进行操作。

  • 相关阅读:
    es5中,一个在js中导入另一个js文件。
    移动端字体小于12号字的时候,line-height居中的问题
    初学者都能懂得 Git 说明
    一探 Vue 数据响应式原理
    文件的命名规则
    Vue 的 watch 和 computed 有什么关系和区别?
    MVC 与 Vue
    博客园皮肤设置
    java使用run和start后的线程引用
    Python改变一行代码实现二叉树前序、中序、后序的迭代遍历
  • 原文地址:https://www.cnblogs.com/kwzblog/p/12133273.html
Copyright © 2020-2023  润新知