1. 程式人生 > >Jena讀取Ontology本體到Mysql資料庫

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條資料。
這裡寫圖片描述
這兩張表儲存關鍵資訊,具體含義待定~。