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條數據。
這裏寫圖片描述
這兩張表存儲關鍵信息,具體含義待定~。

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