Jena讀取Ontology本體到Mysql資料庫
阿新 • • 發佈:2019-02-05
前面我已經介紹瞭如何使用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條資料。
這兩張表儲存關鍵資訊,具體含義待定~。