Jena读取Ontology本体到Mysql数据库

前面我已经介绍了如何使用D2RQ平台来生成我们jean可以解析和推理的RDF文本,这里我来介绍下如何通过jena操作把RDF存到Mysql数据库。
先介绍下整体流程:①加载数据库JDBC驱动。②创建数据库连接。③为数据库创建一个ModelMaker。④为本体创建一个模型。
具体代码如下:
package d2rq;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.db.IDBConnection;
import com.hp.hpl.jena.db.RDFRDBException;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;

public class RDF2Mysql {
    private static Logger log = LogManager.getLogger(RDF2Mysql.class.getName());

    public static final String strDriver = "com.mysql.jdbc.Driver"; // path of
    public static final String strURL = "jdbc:mysql://localhost:3306/academic"; // URL
    public static final String strUser = "root"; // database user id
    public static final String strPassWord = "123456"; // database password
    public static final String strDB = "MySQL"; // database type
    public static final String PATH = "C:/Program Files/d2rq-0.8.1/academic.rdf"; // file path


    public static void main(String[] args) throws UnsupportedEncodingException {
        try {

                // 创建一个数据库连接
                IDBConnection conn = getConnection(strURL, strUser, strPassWord,strDB);
                // 加载数据库驱动类,需要处理异常
                Class.forName(strDriver);
                if(conn!=null){
                    log.debug("-------mysql数据库连接成功~");
                }
                createModel(conn,"MyOntology",PATH);



        } catch (RDFRDBException e) {
            e.printStackTrace();
            log.debug("RDFRDBException occur...");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            log.debug("ClassNotFoundException occur...");
        }
    }

     //获取数据连接
      public static DBConnection getConnection(String dbUrl, String dbUser,  
                String dbPwd, String dbName) {  
            return new DBConnection(dbUrl, dbUser, dbPwd, dbName);   
        } 
      //读取ontology本体,创建模型,存储到RDB中
      public static void createModel(IDBConnection conn, String name,  
                String filePath) {  
          try{
            // 使用数据库连接参数创建一个模型制造器
            ModelMaker maker = ModelFactory.createModelRDBMaker(conn);
            // 创建一个默认模型,命名为 MyOntology
            Model defModel = maker.createModel(name);
            // 准备需要存入数据库的本体文件,建立输入文件流
            FileInputStream inputSreamfile = null;
            try {
                File file = new File(filePath);
                inputSreamfile = new FileInputStream(file);

            } catch (FileNotFoundException e) {
                e.printStackTrace();
                log.debug("Ontology File is not available...");

            }
            InputStreamReader in = new InputStreamReader(inputSreamfile,"UTF-8");
            // 读取文件
            defModel.read(in, null);
            // 关闭输入流读取器
            in.close();

            // 执行数据转换,将本体数据存入数据库
            defModel.commit();
            // 关闭数据库连接
            conn.close();
            log.debug("----ontology-store--database--success~");

        } catch (RDFRDBException e) {
            e.printStackTrace();
            log.debug("RDFRDBException occur...");
        } catch (IOException e) {
            e.printStackTrace();
            log.debug("IOException occur...");
        } catch (SQLException e) {
            e.printStackTrace();
            log.debug("SQLException occur...");
        }
      }

}

执行成功之后会生成7张表如下图:
这里写图片描述
每张表的内容大家可以大致了解下,主要关注表jena_g1t1_stmt和jean_sys_stmt。具体如下:
jena_g1t1_stmt:存储本体数据。
jena_g1t0_reif :经过处理的本体数据。
jena_sys_stmt:系统元数据。
jena_graph:每一个用户图的名字和唯一标志符。
jena_long_lit:陈述表中不便于直接存储的长字符常量。
jena_long_uri:陈述表中不便于直接存储的长URI。
jena_prefix:URI的前缀。
到这里,我们已经了解到本体到Mysql数据库的持久化操作。

我们来查询下表jena_g1t1_stmt:
这里写图片描述
jean_sys_stmt:一共51条数据,因为篇幅太大我这里直接去前11条数据。
这里写图片描述
这两张表存储关键信息,具体含义待定~。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章