在Jena框架下基于MySQL数据库实现本体的存取操作

来源:互联网 发布:sublime php 代码美化 编辑:程序博客网 时间:2024/06/05 07:55

    最近在做一个基于本体的管理系统。其中对本体的操作部分,我使用的是Jena框架;数据模型是基于本体的语义模型;数据存储则是MySQL 5.5.9版本。由此看来,将本体模型存入数据库和从数据库中取出模型是常用的操作,这里总结一下我学到的方法。

    我使用的开发环境是Eclipse3.6,在开发前要将必要的与jena有关的类包加入java build path中,这里就不详述了。对于一个本体,首先要有一个模型与之对应,所以先创建一个模型。在Jena中,可以创建基于文件存储的模型,也可以是基于关系型数据库存储的模型,这里采用后者。代码如下:

   1. ModelMaker maker = ModelFactory.createModelRDBMaker(conn);

   2. Model tempModel = null;

       tempModel = maker.createModel("testDBModel");

   3. OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);

       DBModel = ModelFactory.createOntologyModel(spec, tempModel);

    可以看出,创建过程分为三步:首先创建一个ModelMaker对象,它负责创建模型具体操作,也将模型与DB联系起来,其中ModelFactory.createModelRDBMaker方法的参数conn就是一个数据库连接对象。接着,使用刚才的maker对象创建一个临时的、默认的模型(RDF格式),这里可以指定模型的名称。最后,将临时模型转换成本体模型(OWL格式),其中spec参数表示该模型是在内存中存在的。模型创建完毕。

    下面说到数据库连接。在使用JDBC连接数据库时需要指定JDBC Driver,对于MySQL数据可来说就是MySQL connector/J,这里提供一个下载网址:http://www.mysql.com/downloads/connector/j/,我使用的就是5.1.15版本的。它的使用方法我综合了一些资料总结如下:

    先将压缩包解压到某个目录下,例如d:/temp,确保名称类似mysql-connector-java-5.1.15-bin的jar文件在这个目录下。然后打开环境变量编辑器(windows系统),将CLASSPATH变量中添加一个刚解压的目录,即d:/temp。我开始时一位这样添加了就行了,后来在Eclipse中还是报无法找到JDBC Driver的错误。经过调查了解到,如果使用命令行编辑和编译代码,像刚才那样设定CLASSPATH就OK了,但是如果使用了IDE,如Eclipse,就必须在IDE中再次添加相应的CLASSPATH变量。具体操作如下:

    在Eclipse菜单依次打开Window->preferences->Java->Build path->Classpath Variables,在右边点击New按钮,设定变量名称,然后指定该变量所指向的目录,点击确定既可。最后还要在项目属性的Java Build Path选项添加你刚才新建的变量。

    有了连接驱动,数据库连接代码如下:

    1.IDBConnection conn = null;

    2.Class.forName("com.mysql.jdbc.Driver").newInstance();

    3.String DB_URL = "jdbc:mysql://localhost:3306/testDB";

    4.String DB_USER = "root";

    5.String DB_PASS = "mvp";

    6.String DB_TYPE = "MySQL";


    7.conn = new DBConnection(DB_URL, DB_USER, DB_PASS, DB_TYPE);

    其中第2行就是在指定JDBC connector,应用程序需调用Class.forName 方法来注册或加载驱动程序,com.mysql.jdbc.Driver为驱动程序类名。这条语句最好进行异常处理,因为在找不到驱动程序时会抛出java.lang.ClassNotFoundException异常。另外,下载connector时会有配套的官方文档,里面有详细的例子和解释。

    下面说一下模型的读取和保存。直接看代码:

    tempModel = maker.openModel("testDBModel",true);

    这句话将名为“testDBModel”的模型从数据库里取出保存到tempModel中,参数true表示如果指定的模型不存在,不创建新模型,而是抛出DoesNotExistException异常,Jena API 参见:http://jena.sourceforge.net/javadoc/index.html。

    在使用内存中模型进行一系列的操作后,就会执行:

    DBModel.commit();

    它将模型保存到数据库中。

    最后提一点,在第一次加载模型时,数据库为空,这时可以从文件读取本体到模型,代码如下:

    InputStream inTest = FileManager.get().open(ont1);//ont1是文件路径

    DBModel.read(inTest, testNamespace);//testNamespace是本体中指定的命名空间

    inTest.close();

    第一次将模型存入数据库时,会生成以下几张表:

    jena_g1t0_reif

    jena_g1t1_stmt

    jena_graph

    jena_long_lit

    jena_long_uri

    jena_prefix

    jena_sys_stmt

    具体每张表的作用可参阅:http://blog.csdn.net/longfei8812/archive/2009/12/25/5078366.aspx,也可以使用MySQL的图形化工具自己研究,这里不详述了。

    最后,附上我写的完整代码,请多指教!

package testdb;import java.io.IOException;import java.io.InputStream;import java.sql.SQLException;//import java.sql.DriverManager;import com.hp.hpl.jena.db.DBConnection;import com.hp.hpl.jena.db.IDBConnection;import com.hp.hpl.jena.ontology.OntModel;import com.hp.hpl.jena.ontology.OntModelSpec;import com.hp.hpl.jena.rdf.model.Model;import com.hp.hpl.jena.rdf.model.ModelFactory;import com.hp.hpl.jena.rdf.model.ModelMaker;import com.hp.hpl.jena.util.FileManager;public class DBModelTest {/*** @param args*/private OntModel DBModel;static String ont1 = "E://design//sw资料//ontology//test.owl";static String testNamespace = "http://www.semanticweb.org/ontologies/2011/2/21/test.owl#";public static void main(String[] args) {// TODO Auto-generated method stubDBModelTest dbtest = new DBModelTest();System.out.println("Test MySql DB now.");//从db获取模型,若没有,则从文件导入try{   dbtest.acquireDBForData();}catch(Exception e){System.out.println(e.getMessage().toString());}System.out.println("Save the model to DB...");try{   dbtest.DBModel.commit();}catch(Exception e){System.out.println(e.getMessage().toString());}}private void acquireDBForData() throws SQLException, ClassNotFoundException{IDBConnection conn = null;Model tempModel = null;try{   Class.forName("com.mysql.jdbc.Driver").newInstance();}catch(Exception e){System.out.println(e.getClass().toString() + " " + e.getMessage().toString());}System.out.println("JDBC Driver found");String DB_URL = "jdbc:mysql://localhost:3306/testDB";String DB_USER = "root";String DB_PASS = "mvp";String DB_TYPE = "MySQL";conn = new DBConnection(DB_URL, DB_USER, DB_PASS, DB_TYPE);if(conn.getConnection() != null)System.out.println("Connection successful");elseSystem.out.println("Connection failed!");//下面这条语句将模型与数据库联系起来ModelMaker maker = ModelFactory.createModelRDBMaker(conn);if(conn.containsModel("testDBModel")){System.out.println("Opening existing model");tempModel = maker.openModel("testDBModel",true);}else{System.out.println("Creating new model");tempModel = maker.createModel("testDBModel");//从文件导入数据try{   addDataFromFile();}catch(Exception e){System.out.println(e.getMessage().toString());}}OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);DBModel = ModelFactory.createOntologyModel(spec, tempModel);}private void addDataFromFile() throws IOException{System.out.println("Loading from test owl file...");InputStream inTest = FileManager.get().open(ont1);DBModel.read(inTest, testNamespace);inTest.close();}}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为微信分身版本过低怎么办 手机连接不上4g网络怎么办办 手机通话时老返回锁屏怎么办 小米手机指纹解锁按键不灵了怎么办 小米手机4s黑屏开不了机怎么办 手机老年机突然黑屏开不了机怎么办 苹果7P遮挡传感器就黑屏怎么办 手机被偷支付宝的钱被偷怎么办 oppo手机微信视频黑屏了怎么办 小米账号锁死插卡不显示卡怎么办 红米手机充电时不黑屏怎么办 酷派手机开机出现系统错误怎么办 乐视1s手机开不了机怎么办 酷派手机的信息文件夹不见了怎么办 酷派手机开机卡在开机界面怎么办 魅蓝拨号键老是闪退怎么办 手机上浏览器搜索时字在右边怎么办 酷比魔方平板开不开机怎么办 红米手机摔了有一角黑屏了怎么办 红米手机刷机黑屏打不开怎么办 魅蓝x一打电话就黑屏怎么办 红米手机黑屏打不开怎么办充电发烫 小米手机打电话来是关机的怎么办 红米手机打电话自动灭屏怎么办 红米5s手机白屏怎么办 红米手机黑屏开不了机怎么办 红米note开机键不灵了怎么办 红米2忘记锁屏密码怎么办 红米1手机忘记锁屏密码怎么办 红米4x关不了机怎么办 红米4a手机屏幕黑屏打不开怎么办 红米手机为什么开不了机怎么办 红米note手机刷机失败怎么办 金立手机来电屏幕不亮怎么办 小米5s桌面相机图标不见了怎么办 小米手机锁屏密码忘了怎么办? 小米平板电脑锁屏密码忘了怎么办 小米手机进水了黑屏了嗡嗡响怎么办 华为诺娃2手机声音小怎么办 华为平板锁屏密码忘记了怎么办 华为麦芒6手机按键摔坏了怎么办