在Jena架構下基於MySQL資料庫實現本體的存取操作

來源:互聯網
上載者:User

標籤:

在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資料庫實現本體的存取操作

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.