新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Semantic Web(语义Web,语义网或语义万维网, Web 3.0)及相关理论,如:Ontology(本体,本体论), OWL(Web Ontology Langauge,Web本体语言), Description Logic(DL, 描述逻辑),RDFa,Ontology Engineering等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区W3CHINA.ORG讨论区 - Web新技术讨论『 Semantic Web(语义Web)/描述逻辑/本体 』 → [求助]如何通过调用JenaAPI来修改本体实例的属性值 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 14670 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [求助]如何通过调用JenaAPI来修改本体实例的属性值 举报  打印  推荐  IE收藏夹 
       本主题类别: Ontology Engineering | RDF/RDFS    
     绿色心情1231 帅哥哟,离线,有人找我吗?天蝎座1986-10-25
      
      
      等级:大一(猛啃高等数学)
      文章:12
      积分:166
      门派:XML.ORG.CN
      注册:2009/7/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给绿色心情1231发送一个短消息 把绿色心情1231加入好友 查看绿色心情1231的个人资料 搜索绿色心情1231在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看绿色心情1231的博客楼主
    发贴心情 [求助]如何通过调用JenaAPI来修改本体实例的属性值

    我阅读Jena API,查到有关修改Individual的datatypeProperty的方法是
    void setPropertyValue(Property property,RDFNode value),其中property是所要修改的属性,value是修改的值。而且该方法的调用会首先清除所有property的值,然后在设置新值value。
    但是这个value必须是RDFNode形式,而查了好久,没有那个方法是可以输入对应值返回相应的RDFNode的。比如我需要的方式是修改实例Bill的属性值hasAge为"12",如何能够将12转换为RDFNode???
    或者这个思路不行,还有什么方式可以用JenaAPI来实现对本题实例的属性值的修改的??

       收藏   分享  
    顶(3)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/11 17:27:00
     
     绿色心情1231 帅哥哟,离线,有人找我吗?天蝎座1986-10-25
      
      
      等级:大一(猛啃高等数学)
      文章:12
      积分:166
      门派:XML.ORG.CN
      注册:2009/7/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给绿色心情1231发送一个短消息 把绿色心情1231加入好友 查看绿色心情1231的个人资料 搜索绿色心情1231在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看绿色心情1231的博客2
    发贴心情 
    看了好久的JenaAPI,尝试了好久,终于找到解决之道了!

    方法一:应用于实例Individual的某个Property只有单一属性值的情况,只需将新值替代劳值即可。
    对应于datatypeProperty的值,类型有int,string, double, boolean等等常用类型,其实在Jena中都以string的形式存储,都可以作为Jena中的Literal来表示,OntModel或者Model继承自ModelCon的方法
        Literal createLiteral(java.lang.String v),
    可以用来赋给RDFNode的对象,并作为Individual.setPropertyValue(Property property,RDFNode value)的参数,最后令model中信息写回本体文件中即可。
       基本代码:
    package com.cms.servlet.test;

    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.File;

    import com.hp.hpl.jena.ontology.OntModel;
    import com.hp.hpl.jena.ontology.OntModelSpec;
    import com.hp.hpl.jena.ontology.OntClass;
    import com.hp.hpl.jena.ontology.Individual;
    import com.hp.hpl.jena.ontology.OntProperty;
    import com.hp.hpl.jena.ontology.DatatypeProperty;
    import com.hp.hpl.jena.ontology.ObjectProperty;

    import com.hp.hpl.jena.rdf.model.ModelFactory;
    import com.hp.hpl.jena.rdf.model.Property;
    import com.hp.hpl.jena.rdf.model.RDFNode;

    public class OntologyModifyTest {
        private OntModel ontModel = ModelFactory.createOntologyModel();
        private String filePath = "src\\ontology\\modifyTest.owl";
        private String prefix = "http://www.owl-ontologies.com/Ontology1255195756.owl#";
        private void loadModel() {
            try {
                FileInputStream file = new FileInputStream(filePath);
                InputStreamReader in = new InputStreamReader(file, "UTF-8");
                ontModel.read(in, null);
                in.close();
                               file.close();
            }catch(FileNotFoundException e) {
                e.printStackTrace();
            }catch(IOException e) {
                e.printStackTrace();
            }
        }
        private void writeIntoOntology() {
            try {
                File f = new File(filePath);
                FileOutputStream file = new FileOutputStream(f);
                ontModel.write(file, "");
                file.close();
            }catch(FileNotFoundException e) {
                e.printStackTrace();
            }catch(IOException e) {
                e.printStackTrace();
            }
            loadModel();
        }
        public OntologyModifyTest() {
            ontModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, null);
            loadModel();
            Individual indi = ontModel.getIndividual(prefix + "Rabbit");
            Property pro = ontModel.getProperty(prefix + "name");
            RDFNode rdfNode = ontModel.createLiteral("killer");
            indi.setPropertyValue(pro, rdfNode);
            writeIntoOntology();
        }
        public static void main(String[] args) {
            OntologyModifyTest test = new OntologyModifyTest();
        }
    }

    另外,如果需要对某个Individual的Property覆盖多个属性值,可以先调用一次Individual.setPropertyValue(Property pro, RDFNode value), 然后调用几次Individual.addProperty(Property p, RDFNode o)。

    ----------------------------------------------------------------------------------------------------------------
    方法二:如果只是一般性添加,可通过获得Individual,Property,RDFNode,直接调用Model或者OntModel继承自ModelCon的方法add(Resource s, Property p, RDFNode o) 直接追加就行了。因为Jena的Model(包括OntModel等)都是将所有信息以Statement集合的形式存储的,如果追加的三元组(s, p, o)已经存在了则追加无效,反之则原来对应Property的属性值不变,获得新的值。同样的最后需要类似方法一中的writeIntoOntology() 将修改后的model写入本体文件。

    P.S.
    觉得人总是逼出来的,这个问题晕了整个白天了,发帖向各位前辈问问,等了好久只有阅贴没有回帖的,做的东西又有点赶了,所以就硬着头皮吃过饭接着啃,总算是有所收获了。
    嘿嘿,所以说呢,人的潜力是无限滴!
    最终还是决定把我的自己找的解决之道贴出来,算是自问自答吧!望高手们不吝赐教!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/11 22:22:00
     
     Humphrey 帅哥哟,离线,有人找我吗?狮子座1981-7-23
      
      
      威望:1
      等级:研二(搞定了DL,再搞定F-Logic!)
      文章:937
      积分:5743
      门派:W3CHINA.ORG
      注册:2008/3/12

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Humphrey发送一个短消息 把Humphrey加入好友 查看Humphrey的个人资料 搜索Humphrey在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Humphrey的博客3
    发贴心情 
    是强制类型转换的方法吗?
    感谢楼主分享经验,谢谢!

    ----------------------------------------------
    鸿丰

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/12 16:53:00
     
     绿色心情1231 帅哥哟,离线,有人找我吗?天蝎座1986-10-25
      
      
      等级:大一(猛啃高等数学)
      文章:12
      积分:166
      门派:XML.ORG.CN
      注册:2009/7/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给绿色心情1231发送一个短消息 把绿色心情1231加入好友 查看绿色心情1231的个人资料 搜索绿色心情1231在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看绿色心情1231的博客4
    发贴心情 
    以下是引用Humphrey在2009-10-12 16:53:00的发言:
    是强制类型转换的方法吗?
    感谢楼主分享经验,谢谢!


    不能完全算是强制类型转换,应该是子类的对象可以赋值给超类的对象,或者子接口及实现该接口的类的对象(实现该接口的类以接口的形式传递)可以赋值给超接口。
    以下三个jena中Interface的继承关系为:
        RDFNode extends FrontsNode,Literal  extends RDFNode
    所以以下赋值是有效的:
        RDFNode rdfNode = ontModel.createLiteral("killer")
    因此这是属于子类赋值超类的情况。否则不在继承树同一路径上的类型,Java中是需要显示写出强制转换的类型的。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/10/12 17:06:00
     
     andyneo 帅哥哟,离线,有人找我吗?
      
      
      等级:大二期末(Java考了96分!)
      文章:82
      积分:363
      门派:XML.ORG.CN
      注册:2010/11/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给andyneo发送一个短消息 把andyneo加入好友 查看andyneo的个人资料 搜索andyneo在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 引用回复这个贴子 回复这个贴子 查看andyneo的博客5
    发贴心情 
    楼主有没有什么方法 可以区分个体实例的对象属性和数据属性的 谢谢!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2011/1/18 16:57:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Semantic Web(语义Web)/描述逻辑/本体 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 10:36:24

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms