使用Jena将本体存入MySQL

本文介绍如何利用Jena库将RDF数据整合存储至MySQL数据库,包括数据库接口、存储模式、创建持久模型及数据导入流程。重点阐述了如何创建数据库模型、存入本体文件至MySQL,并通过实例代码演示整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

注明:本文档参考Jena 2.5文档,使用Jena 2.5 API和MySQL5.0.4-beta-nt数据库。MySQL驱动包使用的是mysql-connector-java-3.1.10-bin.jar。

1Jena的数据库接口

Jena提供了将RDF数据存入关系数据库的接口,Model、Resource、Query等接口可以用于访问和维护数据库里的RDF数据。在处理数据时,应用程序不必直接操作数据库(而是通过Jena的API),也不必知道数据库的模式。

Jena提供了支持MySQL、HSQLDB、PostgreSQ、Oracle和Microsoft SQLServer的程序接口。有些第三方提供其他数据库接口的支持。可以参考Jena数据库文档获得数据库版本以及对应的JDBC驱动说明。

2Jena的数据库模式

关系数据库存储RDF数据的一般模式是“三元组”,表有三列(主体、谓词、客体)每个RDF陈述(sataement)占用一行。有时候,添加第四列以表示客体是字符常量还是URI。

Jena2采用一种denormalized的三元组存储方法,是存储空间和访问时间的一种权衡方法(a space-timetrade-off)。Jena使用两类七个表存储本体,第一类是asserted statements,第二类reifiedstatements。

Statement Tables陈述表

1)        Asserted Statement Table (Jena_GiTj_Stmt):存储本体数据

2)        Reified Statement Table(Jena_GiTj_Reif):经过处理的本体数据

System Tables系统表:存储元数据和陈述表中使用的较长的文字或者资源

3)        System Statement Table (Jena_Sys_Stmt):存储系统元数据

4)        Long Literals Table(Jena_Long_Lit):存储陈述表中不便于直接存储的长字符创常量(Literals)

5)        Long Resources Table (Jena_Long_URI):存储陈述表中不便于直接存储的长资源URI

6)        Prefixes Table (Jena_Prefix):存储URI的前缀。前缀只存储一次,节省空间。

7)        Graph Table (Jena_Graph):存储每一个用户图的名字和唯一标志符。

8)        Lock Table (Jena_Mutex):一个没有内容的表。如果该表存在,在一定时间段里数据库被锁定。

可以参照\\Jena-2.5\doc\DB\layout.html获取各个表的详细信息。

3创建本体的持久模型

Jena同时支持内存模型和数据库模型。一般来讲,创建内存模型只需要调用Jena的一些接口,但创建数据库模型,或者打开先前创建的模型,要求一些具体的步骤。

任何数据库的持久模型通过以下步骤创建:

1)        加载数据库JDBC驱动

2)        创建数据库连接

3)        为数据库创建一个ModelMaker

4)        为本体创建一个模型

4将本体存入MySQL

使用Jena将本体出入MySQL中的OntoDatabase数据库。完整代码如下:

 

import java.io.*;
importjava.sql.SQLException;
import com.hp.hpl.jena.db.*;
importcom.hp.hpl.jena.rdf.model.*;
 
public class Onto2Database{
    
    public static final String strDriver ="com.mysql.jdbc.Driver"; // path of driver class
    public static final String strURL ="jdbc:mysql://localhost/OntoDB"; // URL of database
    public static final String strUser = "root"; // databaseuser id
    public static final String strPassWord = "onto"; //database password
    public static final String strDB = "MySQL"; // database type
 
    public static void main(String[] args){
 
        try{
           // 创建一个数据库连接
             IDBConnection conn = new DBConnection ( strURL,strUser, strPassWord, strDB );
           
             // 加载数据库驱动类,需要处理异常
             try{
                  Class.forName(strDriver);
             }catch(ClassNotFoundException e) {
                  System.out.println("ClassNotFoundException, Driver is notavailable...");
             }
             
           // 使用数据库连接参数创建一个模型制造器
             ModelMaker maker =ModelFactory.createModelRDBMaker(conn);
             
             // 创建一个默认模型,命名为 MyOntology
             Model defModel = maker.createModel("MyOntology");
 
             // 准备需要存入数据库的本体文件,建立输入文件流
             FileInputStream inputSreamfile = null;
             try {
                  File file =newFile("G:\\eclipse\\workspace.thesis\\data\\MyOntology.owl");
                  inputSreamfile = new FileInputStream(file);
             } catch (FileNotFoundException e) {
                  e.printStackTrace();
                  System.out.println("Ontology File is notavailable...");
             }
             
             InputStreamReader in = null;
             try {
                  in = new InputStreamReader(inputSreamfile, "UTF-8");
             } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
             }
             
           // 读取文件
           defModel.read(in,null);
           
           // 关闭输入流读取器
           try {
                  in.close();
             } catch (IOException e) {
                  e.printStackTrace();
             }
           
             // 执行数据转换,将本体数据存入数据库
           defModel.commit();
             
           // 关闭数据库连接
             try {
                 conn.close();
             } catch (SQLException e) {
                  e.printStackTrace();
             }
 
        }catch(RDFRDBException e){
             System.out.println("Exceptions occur...");
        }
    }
} // 代码结束


 

5查看数据库中的本体

   执行程序之后,本体被存入MySQL数据库中。主要数据存在两个表中。

1)   ontodatabase.jena_g1t1_stmt 存储了本体的数据信息

2)   ontodatabase.jena_sys_stmt 存储了本体的元数据信息

可以通过命令行查看或者使用MySQLGUI客户端工具查看。建议使用后者。

 

原文地址:http://iMarine.blog.163.com/blog/static/51380183200822775118211/

参考资料

[1]      iMarinehttp://iMarine.blog.163.com

[2]        对Jena的简单理解和一个例子http://imarine.blog.163.com/blog/static/51380183200812774739130/

[3]      \\Jena-2.5\doc\DB\index.html

[4]      \\Jena-2.5\doc\DB\layout.html

[5]      \\Jena-2.5\doc\DB\mysql-howto.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值