以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  使用jena持久化OWL本体到MySQL  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=60494)


--  作者:shalen2008
--  发布时间:3/26/2008 10:58:00 PM

--  使用jena持久化OWL本体到MySQL
遇到了好多问题,终于实现了OWL本体到MySQL的存储和读取,首先应该配置好环境,在项目中添加jena的相关包,值得注意的是MySQL的驱动和版本要一致。
    我是用protege创建OWL本体,然后再从OWL文件中读取,存入MySQL数据库,注意在保存OWL本体的时候最好项目另存为的LANGUAGE选择RDF/XML,最好用UTF-8编码,这样读取出错的机会少一些,图片在附件中。
    下面是操作的java代码:

/* 连接数据库 */
public static IDBConnection connectDB(String DB_URL, String DB_USER,
 String DB_PASSWD, String DB_NAME) {
    return new DBConnection(DB_URL, DB_USER, DB_PASSWD, DB_NAME);
}
 
/* 从文件读取本体并将其存入数据库 */
public static OntModel createDBModelFromFile(IDBConnection con, String name,
   String filePath) {
    ModelMaker maker = ModelFactory.createModelRDBMaker(con);
    Model base = maker.createModel(name);
    OntModel newmodel = ModelFactory.createOntologyModel(
 getModelSpec(maker), base);
    newmodel.read(filePath);
    return newmodel;
}

/* 从数据库中得到已存入本体 */
public static OntModel getModelFromDB(IDBConnection con, String name) {
    ModelMaker maker = ModelFactory.createModelRDBMaker(con);
    Model base = maker.getModel(name);
    OntModel newmodel = ModelFactory.createOntologyModel(
 getModelSpec(maker), base);
    return newmodel;
}

public static OntModelSpec getModelSpec(ModelMaker maker) {
    OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);
    spec.setImportModelMaker(maker);
    return spec;
}

下面是测试的代码,先从文件中读取,让后存入数据库中,再从数据库中读出。
public static void test() {
    String DB_URL = "jdbc:mysql://localhost/expert";
    String DB_USER = "root";
    String DB_PASSWD = "root";
    String DB = "MySQL";
    String DB_DRIVER = "com.mysql.jdbc.Driver";
  
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
  
    String filePath = "file:C://expert//Expert.rdf-xml.owl";
    IDBConnection con = JaneUtils.connectDB(DB_URL,DB_USER, DB_PASSWD, DB);
    System.out.println(con);
  
    JaneUtils.createDBModelFromFile(con, "expert",filePath);  
    OntModel model = JaneUtils.getModelFromDB(con, "expert");
    JaneUtils.SimpleReadOntology(model);
}

/* 简单读取本体中的各个class */
public static void SimpleReadOntology(OntModel model) {
    for (Iterator i = model.listClasses(); i.hasNext();) {
        OntClass c = (OntClass) i.next();
        System.out.println(c.getLocalName());
    }
}


此主题相关图片如下:
按此在新窗口浏览图片


[此贴子已经被作者于2008-3-31 19:57:53编辑过]

--  作者:happykite
--  发布时间:3/27/2008 10:22:00 AM

--  
请问本体中的那些实例实例是怎么存储的,怎么调用呢?
--  作者:l.hongjun
--  发布时间:3/27/2008 6:27:00 PM

--  
好东西,参考。
附上我整理的一个
http://imarine.blog.163.com/blog/static/51380183200822775118211/
--  作者:shalen2008
--  发布时间:3/27/2008 11:41:00 PM

--  从MySQL中读取个体
我是在protege中创建个体的,导出来类和个体在一个OWL文件中,一块存入MySQL,
从数据库读出本体后可以用下面的方法可以读出个体:

/*获取个体*/
public static void getInstance(OntModel model){
    String prix = "http://www.owl-ontologies.com/Expert.owl#";
    /*得到本体中的Expert类*/
    OntClass expert = model.getOntClass(prix + "Expert");
    //打印类名
    System.out.println(expert.getLocalName());
  
    //获得其所以个体
    ExtendedIterator it = expert.listInstances();
    //打印其个体
    while(it.hasNext()){
        Individual oi = (Individual)it.next();
        System.out.println(oi.getLocalName());
    }
}
网址http://jena.sourceforge.net/ontology/index.html有jena API操作OWL的介绍。


--  作者:koolfenglei
--  发布时间:3/28/2008 3:12:00 PM

--  
请问一下,你知道从数据库中读出owl的信息后,如何能用rdf图显示出来?

--  作者:shalen2008
--  发布时间:3/28/2008 4:57:00 PM

--  
我主要是用owl来做查询,本体的创建都是在protege中实现的,然后导出成rdf的格式,用的图是protege中的类关系图,没有试过用rdf的图,而且owl和rdf还是有差别的。
--  作者:koolfenglei
--  发布时间:3/29/2008 10:56:00 AM

--  
请问JaneUtils是个什么函数啊,是jena包自带的?还是你自己编写的?
--  作者:koolfenglei
--  发布时间:3/29/2008 1:24:00 PM

--  
我把JaneUtils去掉了以后,程序照样能够运行啊!
--  作者:shalen2008
--  发布时间:3/30/2008 9:24:00 PM

--  
那是我自己写的,用来测试的
--  作者:shalen2008
--  发布时间:3/31/2008 7:35:00 PM

--  

下面的方法打印其个体和所有属性的值:

/* 获取个体及其属性值 */
public static void getInstance(OntModel model) {
    String NS = "http://www.owl-ontologies.com/Expert.owl#";
    /* 得到本体中的Expert类 */
    OntClass expert = model.getOntClass(NS + "Expert");
    // 打印类名
    System.out.println(expert.getLocalName());

    // 获得其所以个体
    ExtendedIterator it = expert.listInstances();
    // 打印其个体
    while (it.hasNext()) {
        Individual oi = (Individual) it.next();
        System.out.println(oi.getLocalName());

        for (Iterator ipp = expert.listDeclaredProperties(); ipp.hasNext();) {
            OntProperty p = (OntProperty) ipp.next();
            System.out.println("  associated property: " + p.getLocalName() + " : "+oi.getPropertyValue(p));
        }// property ends
    }
}

[此贴子已经被作者于2008-3-31 20:11:51编辑过]

--  作者:chenli97
--  发布时间:4/5/2008 9:59:00 PM

--  
请问你存入MySQL中之后的表有哪几个字段,字段属性如何,我怎么不能成功
--  作者:chenli97
--  发布时间:4/5/2008 10:12:00 PM

--  
可否麻烦你上传一份本体导入MySQL后MySQL的表结构?以便参考.谢谢
--  作者:shalen2008
--  发布时间:4/6/2008 12:09:00 PM

--  
把本体存入数据库之后,使用的时候是读出本体模型,再对本体模型使用Jena的sparql对本体进行推理查询,也可以修改本体模型,好像不能通过MySQL的SQL查询本体的信息,Jena封装了与数据库交互的部分。文章已经更新了,有存入数据库的表内容。
使用Jena的sparql对本体进行推理查询下面网址有一些介绍:
http://bbs.w3china.org/dispbbs.asp?boardID=2&ID=60678
--  作者:shalen2008
--  发布时间:4/6/2008 12:19:00 PM

--  
注意MySQL安装时选择UTF-8编码,还有驱动版本要一致,本体要另存为rdf/xml格式,这在文章中已经说了。下面是表结构,我已经成功测试存入,读出和简单推理查询。
mysql> show tables;
+------------------+
| Tables_in_expert |
+------------------+
| jena_g1t0_reif   |
| jena_g1t1_stmt   |
| jena_graph       |
| jena_long_lit    |
| jena_long_uri    |
| jena_prefix      |
| jena_sys_stmt    |
+------------------+
7 rows in set (0.02 sec)
--  作者:chenli97
--  发布时间:4/6/2008 3:30:00 PM

--  
谢谢你的答复

--  作者:chrice
--  发布时间:4/11/2008 1:33:00 PM

--  
请问各位,从protege中把owl文件存入mysql数据库后,怎么才能再读出来呢
--  作者:Humphrey
--  发布时间:4/12/2008 9:13:00 AM

--  
除使用MySQL之外,也有专门的本体数据库吧?
或者有什么方法可以返回存储在关系数据库中的每一行本体数据和数据结构呢?
还望诸位高手指教,谢谢!
最后说一句,这个主题不错,希望能够永远保留下来(包括外联链接中的内容)。
--  作者:memqqi
--  发布时间:4/18/2008 9:09:00 PM

--  
不好意思,提一个很初级的问题。我按照tutorial上步骤,始终没有成功地在protege中连上JDBC驱动,不是提示“没有找到driver”(我在classpath中已经设置了),就是提示“用户名或密码不对”(实际上没有错)。希望哪位能给我帮助。谢谢!
--  作者:jxlhljh
--  发布时间:5/24/2008 5:44:00 PM

--  
我也连不上driver,。。。不知道怎么搞的。
--  作者:aximou
--  发布时间:5/26/2008 11:59:00 PM

--  
有谁知道用MSSQL来持久化本体的方法?jena的文档里对mysql和oracle都有详细的例子,惟独对mssql草草了事,让人好不郁闷!
--  作者:jpz6311whu
--  发布时间:5/27/2008 11:29:00 AM

--  
以下是引用aximou在2008-5-26 23:59:00的发言:
有谁知道用MSSQL来持久化本体的方法?jena的文档里对mysql和oracle都有详细的例子,惟独对mssql草草了事,让人好不郁闷!


差不多的,数据库不同只是连接的时候驱动程序和连接字符串不一样,建立好model之后后面的方法都是一样的。
--  作者:zhenzixiong
--  发布时间:6/24/2008 2:54:00 PM

--  
学习学习
--  作者:xpg0312
--  发布时间:9/18/2008 4:05:00 PM

--  
为什么要把本体文件再存到数据库中呢?可不可以直接对文件进行操作呢?
存在数据库中再进行本体的操作有哪些好处呢?
请大家指教一下。
--  作者:zym88
--  发布时间:4/26/2009 8:28:00 PM

--  大虾请问怎样才能将用Jena解析过的owl本体存入Mysql后从Mysql中读出并实现查询呢?谢谢!我太菜了,你发的源代码我试了一下不能实现我的程序?
不胜感激!
--  作者:springbird
--  发布时间:12/30/2009 3:35:00 PM

--  
你好在研究推理那块,不知道jena如何推理呢,例如,写了一个规则[rule1:(?a http://www.owl-ontologies.com/OntologyToCool.owl#part_function ?b),(?b http://www.owl-ontologies.com/OntologyToCool.owl#selected_way ?c)->(?a http://www.owl-ontologies.com/OntologyToCool.owl#selected_way ?c)],意思就是a是b的部分,b选择的方法是c,我想推出a选择的方法也是c!
我用SPARQL写了查询语句,"SELECT ?function ?way "+
   " WHERE  { "+
    "?function eg:selected_way ?way."+
    "}";
可是却得不到结果,请教一下楼主我写的对吗?另外弱弱的问一句,推理是对实例推理还是对概念推理,我刚接学本体不久,这些概念不太明白,谢谢楼主了
--  作者:Avansky
--  发布时间:4/15/2010 11:22:00 AM

--  
本体持久化就是把本体存入数据库?

那查询的时候就不用SPARQL了,只要用SQL就行了吗?

望高手指点一下!
不胜感激!


--  作者:lzx211314
--  发布时间:4/16/2010 5:48:00 PM

--  
好东西哦,谢谢
--  作者:lzx211314
--  发布时间:4/19/2010 2:41:00 PM

--  
谁能不能给个从客户端读入信息,然后存储到本体数据库中的一些操作啊。谢谢了。因为是毕设,所以请大家一定多帮帮忙。我的邮箱:lzx211314@163.com
--  作者:angleangleangle
--  发布时间:4/19/2010 3:44:00 PM

--  
请问楼主这两个过程:从OWL文件中读取,存入MySQL数据库,是怎么实现的呢。
--  作者:angleangleangle
--  发布时间:4/19/2010 4:30:00 PM

--  
protege怎么连接的上数据库的呢?
--  作者:angleangleangle
--  发布时间:4/19/2010 4:30:00 PM

--  
protege怎样连接jdbc的?

--  作者:angleangleangle
--  发布时间:4/19/2010 8:27:00 PM

--  
楼主是在什么环境下实现的?

--  作者:angleangleangle
--  发布时间:4/20/2010 9:22:00 AM

--  
为什么我的运行不出来?
--  作者:angleangleangle
--  发布时间:4/20/2010 6:18:00 PM

--  
/* 连接数据库 */
public static IDBConnection connectDB(String DB_URL, String DB_USER,
String DB_PASSWD, String DB_NAME) {
    return new DBConnection(DB_URL, DB_USER, DB_PASSWD, DB_NAME);
} 这个链接数据库是怎么链接的啊?
--  作者:angleangleangle
--  发布时间:4/20/2010 6:18:00 PM

--  
怎么老是提示错误?
--  作者:shenxin1986
--  发布时间:4/21/2010 9:40:00 AM

--  
MySQL的驱动和版本要一致。楼主用的是那个版本的?
mysql和驱动
--  作者:angleangleangle
--  发布时间:5/5/2010 4:26:00 PM

--  
楼主的QQ是多少?我没有运行出来,请教一下。。。。我的QQ942886965
--  作者:service365
--  发布时间:5/7/2010 12:15:00 PM

--  
以下是引用springbird在2009-12-30 15:35:00的发言:
你好在研究推理那块,不知道jena如何推理呢,例如,写了一个规则[rule1:(?a http://www.owl-ontologies.com/OntologyToCool.owl#part_function ?b),(?b http://www.owl-ontologies.com/OntologyToCool.owl#selected_way ?c)->(?a http://www.owl-ontologies.com/OntologyToCool.owl#selected_way ?c)],意思就是a是b的部分,b选择的方法是c,我想推出a选择的方法也是c!
我用SPARQL写了查询语句,"SELECT ?function ?way "+
    " WHERE  { "+
     "?function eg:selected_way ?way."+
     "}";
可是却得不到结果,请教一下楼主我写的对吗?另外弱弱的问一句,推理是对实例推理还是对概念推理,我刚接学本体不久,这些概念不太明白,谢谢楼主了


这么简单的规则,用RDF来表示,搞的这么复杂,真搞不懂本体有啥用处了,感觉就是垃圾
--  作者:shenxin1986
--  发布时间:6/4/2010 8:37:00 PM

--  


--  作者:sos909111
--  发布时间:6/5/2010 11:10:00 AM

--  
谢谢楼主 很有参考价值
--  作者:renzhigen12
--  发布时间:5/6/2011 10:59:00 AM

--  
very good!
--  作者:nhwshy
--  发布时间:4/20/2012 11:01:00 AM

--  
import struts.bean.Bean;
import struts.bean.Book;
import struts.bean.Encouragement;
import struts.bean.Expert;
import struts.bean.Paper;
import struts.bean.Patent;
import struts.bean.Project;
import struts.bean.SearchListBean;
导入的struts 文件到哪里可以找到,并不是struts.jar 中的呀
--  作者:lijunhuaforever
--  发布时间:6/4/2012 9:26:00 AM

--  
从MySQL中读取个体

我是在protege中创建个体的,导出来类和个体在一个OWL文件中,一块存入MySQL,
从数据库读出本体后可以用下面的方法可以读出个体:

/*获取个体*/
public static void getInstance(OntModel model){
    String prix = "http://www.owl-ontologies.com/Expert.owl#";
    /*得到本体中的Expert类*/
    OntClass expert = model.getOntClass(prix + "Expert");
    //打印类名


问一下 如果把Expert换成键盘输入的为什么不可以啊 如果想要换成键盘输入应该怎么办啊


--  作者:dongying_owl
--  发布时间:6/8/2012 3:57:00 PM

--  
您好,我是用jena直接读本体文件的,类和数据是分开存储的,请问怎么能获得一个类的所有实例啊?该类包含两层子类。麻烦高手帮忙~
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
218.750ms