JENA:初始化 HSQLDB RDF 数据存储

Posted

技术标签:

【中文标题】JENA:初始化 HSQLDB RDF 数据存储【英文标题】:JENA: initializing a HSQLDB RDF datastore 【发布时间】:2010-11-18 13:31:21 【问题描述】:

我正在尝试使用 JenaHSQLDB 初始化 RDF 数据存储。从http://jena.sourceforge.net/DB/hsql-howto.html我写了如下代码:

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

我该如何解决这个问题?

非常感谢,

皮埃尔

【问题讨论】:

【参考方案1】:

有关 Jena 的信息表明他们使用的是 HSQLDB 1.8.x 或更早版本。您可以尝试 HSQLDB 1.8.1.3,它是 1.8.x 系列中的最新版本。

【讨论】:

我的版本是hsqldb-2.0.1-rc2 我查看了他们的代码,它显示了对 HSQLDB 1.8.0.x 的适当支持。因此,您应该使用与 1.8.0.10 兼容的 1.8.1.3 获得结果。【参考方案2】:

强烈建议您现在在耶拿使用 SDB 而不是 RDB。切换到 SDB。

至于这里出了什么问题,我猜我会说 HSQL 语法是错误的。自从编写 RDB 以来,HSQL 可能发生了变化?你能检查一下实际的问题陈述吗?

【讨论】:

以上是关于JENA:初始化 HSQLDB RDF 数据存储的主要内容,如果未能解决你的问题,请参考以下文章

java 使用Apache Jena的API(不是RESTful API)从RDF数据构建数据库并回答Java中的SPARQL查询

面试官:说一下Jena推理

jena TDB2使用哪些指数?

Riotexception:没有用于 RDF/XML/pretty 的数据集编写器

面试官:说一下Jena推理

基于本体的语义网生成工具