標籤:
在Jena架構下基於MySQL資料庫實現本體的存取操作
轉自:http://blog.csdn.net/jtz_mpp/article/details/6224311
最近在做一個基於本體的管理系統。其中對本體的操作部分,我使用的是Jena架構;資料模型是基於本體的語義模型;資料存放區則是MySQL 5.5.9版本。由此看來,將本體模型存入資料庫和從資料庫中取出模型是常用的操作,這裡總結一下我學到的方法。
我使用的開發環境是Eclipse3.6,在開發前要將必要的與jena有關的類包加入java build path中,這裡就不詳述了。對於一個本體,首先要有一個模型與之對應,所以先建立一個模型。在Jena中,可以建立基於檔案儲存體的模型,也可以是基於關係型資料庫儲存的模型,這裡採用後者。代碼如下:
1. ModelMaker maker = ModelFactory.createModelRDBMaker(conn);
2. Model tempModel = null;
tempModel = maker.createModel("testDBModel");
3. OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM);
DBModel = ModelFactory.createOntologyModel(spec, tempModel);
可以看出,建立過程分為三步:首先建立一個ModelMaker對象,它負責建立模型具體操作,也將模型與DB聯絡起來,其中ModelFactory.createModelRDBMaker方法的參數conn就是一個資料庫連接對象。接著,使用剛才的maker對象建立一個臨時的、預設的模型(RDF格式),這裡可以指定模型的名稱。最後,將臨時模型轉換成本體模型(OWL格式),其中spec參數表示該模型是在記憶體中存在的。模型建立完畢。
下面說到資料庫連接。在使用JDBC串連資料庫時需要指定JDBC Driver,對於MySQL資料可來說就是MySQL connector/J,這裡提供一個下載網址:http://www.mysql.com/downloads/connector/j/,我使用的就是5.1.15版本的。它的使用方法我綜合了一些資料總結如下:
先將壓縮包解壓到某個目錄下,例如d:/temp,確保名稱類似mysql-connector-java-5.1.15-bin的jar檔案在這個目錄下。然後開啟環境變數編輯器(windows系統),將CLASSPATH變數中添加一個剛解壓的目錄,即d:/temp。我開始時一位這樣添加了就行了,後來在Eclipse中還是報無法找到JDBC Driver的錯誤。經過調查瞭解到,如果使用命令列編輯和編譯代碼,像剛才那樣設定CLASSPATH就OK了,但是如果使用了IDE,如Eclipse,就必須在IDE中再次添加相應的CLASSPATH變數。具體操作如下:
在Eclipse菜單依次開啟Window->preferences->Java->Build path->Classpath Variables,在右邊點擊New按鈕,設定變數名稱,然後指定該變數所指向的目錄,點擊確定既可。最後還要在項目屬性的Java Build Path選項添加你剛才建立的變數。
有了串連驅動,資料庫連接代碼如下:
1.IDBConnection conn = null;
2.Class.forName("com.mysql.jdbc.Driver").newInstance();
3.String DB_URL = "jdbc:mysql://localhost:3306/testDB";
4.String DB_USER = "root";
5.String DB_PASS = "mvp";
6.String DB_TYPE = "MySQL";
7.conn = new DBConnection(DB_URL, DB_USER, DB_PASS, DB_TYPE);
其中第2行就是在指定JDBC connector,應用程式需調用Class.forName 方法來註冊或載入驅動程式,com.mysql.jdbc.Driver為驅動程式類名。這條語句最好進行異常處理,因為在找不到驅動程式時會拋出java.lang.ClassNotFoundException異常。另外,下載connector時會有配套的官方文檔,裡面有詳細的例子和解釋。
下面說一下模型的讀取和儲存。直接看代碼:
tempModel = maker.openModel("testDBModel",true);
這句話將名為“testDBModel”的模型從資料庫裡取出儲存到tempModel中,參數true表示如果指定的模型不存在,不建立新模型,而是拋出DoesNotExistException異常,Jena API 參見:http://jena.sourceforge.net/javadoc/index.html。
在使用記憶體中模型進行一系列的操作後,就會執行:
DBModel.commit();
它將模型儲存到資料庫中。
最後提一點,在第一次載入模型時,資料庫為空白,這時可以從檔案讀取本體到模型,代碼如下:
InputStream inTest = FileManager.get().open(ont1);//ont1是檔案路徑
DBModel.read(inTest, testNamespace);//testNamespace是本體中指定的命名空間
inTest.close();
第一次將模型存入資料庫時,會產生以下幾張表:
jena_g1t0_reif
jena_g1t1_stmt
jena_graph
jena_long_lit
jena_long_uri
jena_prefix
jena_sys_stmt
具體每張表的作用可參閱:http://blog.csdn.net/longfei8812/archive/2009/12/25/5078366.aspx,也可以使用MySQL的圖形化工具自己研究,這裡不詳述了。
最後,附上我寫的完整代碼,請多指教!
1 [java] view plain copy 2 package testdb; 3 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.sql.SQLException; 7 //import java.sql.DriverManager; 8 9 import com.hp.hpl.jena.db.DBConnection; 10 import com.hp.hpl.jena.db.IDBConnection; 11 import com.hp.hpl.jena.ontology.OntModel; 12 import com.hp.hpl.jena.ontology.OntModelSpec; 13 import com.hp.hpl.jena.rdf.model.Model; 14 import com.hp.hpl.jena.rdf.model.ModelFactory; 15 import com.hp.hpl.jena.rdf.model.ModelMaker; 16 import com.hp.hpl.jena.util.FileManager; 17 18 public class DBModelTest { 19 20 /** 21 * @param args 22 */ 23 private OntModel DBModel; 24 static String ont1 = "E://design//sw資料//ontology//test.owl"; 25 static String testNamespace = "http://www.semanticweb.org/ontologies/2011/2/21/test.owl#"; 26 27 public static void main(String[] args) { 28 // TODO Auto-generated method stub 29 DBModelTest dbtest = new DBModelTest(); 30 System.out.println("Test MySql DB now."); 31 //從db擷取模型,若沒有,則從檔案匯入 32 try 33 { 34 dbtest.acquireDBForData(); 35 } 36 catch(Exception e) 37 { 38 System.out.println(e.getMessage().toString()); 39 } 40 System.out.println("Save the model to DB..."); 41 try 42 { 43 dbtest.DBModel.commit(); 44 } 45 catch(Exception e) 46 { 47 System.out.println(e.getMessage().toString()); 48 } 49 } 50 private void acquireDBForData() throws SQLException, ClassNotFoundException 51 { 52 IDBConnection conn = null; 53 Model tempModel = null; 54 try 55 { 56 Class.forName("com.mysql.jdbc.Driver").newInstance(); 57 } 58 catch(Exception e) 59 { 60 System.out.println(e.getClass().toString() + " " + e.getMessage().toString()); 61 } 62 System.out.println("JDBC Driver found"); 63 String DB_URL = "jdbc:mysql://localhost:3306/testDB"; 64 String DB_USER = "root"; 65 String DB_PASS = "mvp"; 66 String DB_TYPE = "MySQL"; 67 conn = new DBConnection(DB_URL, DB_USER, DB_PASS, DB_TYPE); 68 if(conn.getConnection() != null) 69 System.out.println("Connection successful"); 70 else 71 System.out.println("Connection failed!"); 72 //下面這條語句將模型與資料庫聯絡起來 73 ModelMaker maker = ModelFactory.createModelRDBMaker(conn); 74 if(conn.containsModel("testDBModel")) 75 { 76 System.out.println("Opening existing model"); 77 tempModel = maker.openModel("testDBModel",true); 78 } 79 else 80 { 81 System.out.println("Creating new model"); 82 tempModel = maker.createModel("testDBModel"); 83 //從檔案匯入資料 84 try 85 { 86 addDataFromFile(); 87 } 88 catch(Exception e) 89 { 90 System.out.println(e.getMessage().toString()); 91 } 92 } 93 OntModelSpec spec = new OntModelSpec(OntModelSpec.OWL_MEM); 94 DBModel = ModelFactory.createOntologyModel(spec, tempModel); 95 } 96 private void addDataFromFile() throws IOException 97 { 98 System.out.println("Loading from test owl file..."); 99 InputStream inTest = FileManager.get().open(ont1); 100 DBModel.read(inTest, testNamespace); 101 inTest.close(); 102 } 103 104 }
在Jena架構下基於MySQL資料庫實現本體的存取操作