前面我已經介紹瞭如何使用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條數據。
這兩張表存儲關鍵信息,具體含義待定~。