2010-11-18 103 views
2

我試圖初始化使用耶拿HSQLDB一個RDF數據存儲。從http://jena.sourceforge.net/DB/hsql-howto.html我寫了下面的代碼:JENA:初始化HSQLDB RDF數據存儲

import com.hp.hpl.jena.db.DBConnection; 
import com.hp.hpl.jena.db.IDBConnection; 
import com.hp.hpl.jena.db.impl.Driver_HSQL; 
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 Test 
    { 
    /** */ 
    private String idbDriver="org.hsqldb.jdbcDriver"; 
    private String idbUrl="jdbc:hsqldb:file:/home/me/DATASTORE.HSQLDB"; 
    private String idbUser="sa"; 
    private String idbPassword=""; 

    /** RDF Model */ 
    private Model model=ModelFactory.createDefaultModel(); 
    /** IDB connection */ 
    private IDBConnection idbConnection=null; 

    public Test() 
     { 

     } 

    public void open() throws Exception 
     { 
     close(); 
     Class.forName(idbDriver); 
     this.idbConnection = new DBConnection(idbUrl, idbUser, idbPassword, "HSQL"); 
     ModelMaker maker = ModelFactory.createModelRDBMaker(this.idbConnection) ; 
     this.model=maker.createDefaultModel(); 
     } 

    public void close()throws Exception 
     { 
     this.model=null; 
     if(this.idbConnection!=null) 
      { 
      // http://jena.sourceforge.net/DB/hsql-howto.html 
      Driver_HSQL.class.cast(this.idbConnection.getDriver()).shutdown(); 
      this.idbConnection.close(); 
      this.idbConnection=null; 
      } 
     } 

    public Model getModel() 
     { 
     return model; 
     } 

    public static void main(String[] args) 
     { 
     try { 
      Test app=new Test(); 
      app.open(); 
      app.close(); 
      } 
     catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 
     } 

    } 

但執行程序時,我得到了以下異常:

INFO [main] (?:?) - open start 
INFO [main] (?:?) - open end 
INFO [main] (?:?) - DataFileCache.close(true) : start 
INFO [main] (?:?) - DataFileCache.close() : save data 
INFO [main] (?:?) - DataFileCache.close() : close 
INFO [main] (?:?) - open start 
INFO [main] (?:?) - open end 
WARN [main] (DriverRDB.java:430) - Problem formatting database 
java.sql.SQLException: unexpected token: PRIMARY : line: 3 
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
    at org.hsqldb.jdbc.JDBCStatement.execute(Unknown Source) 
    at com.hp.hpl.jena.db.impl.SQLCache.runSQLGroup(SQLCache.java:562) 
    at com.hp.hpl.jena.db.impl.DriverRDB.formatAndConstructSystemSpecializedGraph(DriverRDB.java:427) 
    at com.hp.hpl.jena.db.impl.DriverRDB.getSystemSpecializedGraph(DriverRDB.java:305) 
    at com.hp.hpl.jena.db.impl.DriverRDB.getDefaultModelProperties(DriverRDB.java:834) 
    at com.hp.hpl.jena.db.DBConnection.getDefaultModelProperties(DBConnection.java:164) 
    at com.hp.hpl.jena.db.impl.GraphRDBMaker.consGraph(GraphRDBMaker.java:111) 
    at com.hp.hpl.jena.db.impl.GraphRDBMaker.getGraph(GraphRDBMaker.java:52) 
    at com.hp.hpl.jena.rdf.model.impl.ModelMakerImpl.createDefaultModel(ModelMakerImpl.java:58) 
    at Test.open(Test.java:34) 
    at Test.main(Test.java:58) 
Caused by: org.hsqldb.HsqlException: unexpected token: PRIMARY : line: 3 
    at org.hsqldb.error.Error.parseError(Unknown Source) 
    at org.hsqldb.ParserBase.unexpectedToken(Unknown Source) 
    at org.hsqldb.ParserDDL.compileCreateTableBody(Unknown Source) 
    at org.hsqldb.ParserDDL.compileCreateTable(Unknown Source) 
    at org.hsqldb.ParserDDL.compileCreate(Unknown Source) 
    at org.hsqldb.ParserCommand.compilePart(Unknown Source) 
    at org.hsqldb.ParserCommand.compileStatements(Unknown Source) 
    at org.hsqldb.Session.executeDirectStatement(Unknown Source) 
    at org.hsqldb.Session.execute(Unknown Source) 
    ... 12 more 
com.hp.hpl.jena.shared.JenaException: The database appears to be unformatted or corrupted and 
an attempt to automatically format the database has failed 

    at com.hp.hpl.jena.db.impl.DriverRDB.getSystemSpecializedGraph(DriverRDB.java:311) 
    at com.hp.hpl.jena.db.impl.DriverRDB.getDefaultModelProperties(DriverRDB.java:834) 
    at com.hp.hpl.jena.db.DBConnection.getDefaultModelProperties(DBConnection.java:164) 
    at com.hp.hpl.jena.db.impl.GraphRDBMaker.consGraph(GraphRDBMaker.java:111) 
    at com.hp.hpl.jena.db.impl.GraphRDBMaker.getGraph(GraphRDBMaker.java:52) 
    at com.hp.hpl.jena.rdf.model.impl.ModelMakerImpl.createDefaultModel(ModelMakerImpl.java:58) 
    at Test.open(Test.java:34) 
    at Test.main(Test.java:58) 
Caused by: com.hp.hpl.jena.db.RDFRDBException: java.sql.SQLException: unexpected token: PRIMARY : line: 3 
    at com.hp.hpl.jena.db.impl.DriverRDB.formatAndConstructSystemSpecializedGraph(DriverRDB.java:477) 
    at com.hp.hpl.jena.db.impl.DriverRDB.getSystemSpecializedGraph(DriverRDB.java:305) 
    ... 7 more 

我怎樣才能解決這個問題?

非常感謝,

皮埃爾

回答

3

關於Jena的信息表明他們使用HSQLDB 1.8.x或更高版本。您可以試用1.8.x系列中最新的HSQLDB 1.8.1.3。

+0

我的版本是hsqldb-2.0.1-rc2 – Pierre 2010-11-18 16:47:50

+0

我看過他們的代碼,它顯示了對HSQLDB 1.8.0.x的正確支持。因此,您應該獲得1.8.1.3的結果,該結果與1.8.0.10兼容。 – fredt 2010-11-18 17:30:42

2

您是強烈建議使用SDB而不是RDB在耶拿的這些日子。切換到SDB。

至於什麼是錯誤的,在猜測我會說一些關於HSQL語法是錯誤的。自從RDB編寫以來,HSQL是否已經發生了變化?你能檢查看看實際的問題陳述嗎?