JENA:初始化 HSQLDB RDF 数据存储
Posted
技术标签:
【中文标题】JENA:初始化 HSQLDB RDF 数据存储【英文标题】:JENA: initializing a HSQLDB RDF datastore 【发布时间】:2010-11-18 13:31:21 【问题描述】:我正在尝试使用 Jena 和 HSQLDB 初始化 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查询