最近两天刚接触jena,其实就是想解析将owl入库,很快就从网上找到了程序,但是一直不能通过,一直的问题是
WARNING: Problem formatting database
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jena.jena_sys_stmt' doesn't exist
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jena.jena_sys_stmt' doesn't exist
貌似又有很多人没有遇到这个问题,因为解决方案没找到。
找到的程序博主说用的是jena2.5,反正我刚开始下的版本是2.11,包都已经找不到了,只能用低版本。
废话不多说,重点:
下载下来的jena包都可以看看,首先要把scr里所有程序都加载进来,这些对应的是lib里的各个包,但是这个可以看到源代码
里面有很多 example,其中
jena.examples.ontology.persistentOntology这个包里就是把数据持久化的例子,修改好一些参数后,发现出现的异常还是一个,于是顺着程序慢慢找。(如果从一开始下载的那个程序找,会发现找到的是抽象类,没有具体方法)
最终在SQLCache.java里面找到了runSQLGroup(String opname, String [] attr)这个方法,问题就在这里~!!!
捕获异常时有一句:System.out.println("Exec failure: " + op + ": " + e);被屏蔽了,去掉屏蔽就发现问题啦~~
其实异常时对表里的字段建立索引的时候出现的,但是要建索引的表不存在。。。。
op是执行的sql语句,把所有的op输出,可发现根源问题不是建索引的时候,而是 建表的时候!!
可能是数据库版本问题,有些语句是不符合的,如
CREATE TABLE jena_g11t0_reif (
//此处省略一万字。。。
) TYPE = INNODB
) TYPE = INNODB
我用的mysql 5.5 ,最后的“TYPE = INNODB”不执行,所以每次新建表的时候就出现异常。。
解决办法:
我的数据库可以识别 ENGINE=InnoDB。。。不过我没有用,根据需要可以把op 的最后一句替换掉,我只是在execute(op)之前加了个替换:
if(op.indexOf("TYPE = INNODB") > 0){
op = op.substring(0,op.indexOf("TYPE = INNODB"));
}
if(op.indexOf("TYPE = INNODB") > 0){
op = op.substring(0,op.indexOf("TYPE = INNODB"));
}
}
if(op.indexOf("TYPE = INNODB") > 0){
op = op.substring(0,op.indexOf("TYPE = INNODB"));
}
这两句if条件有区别吗?有! 第一个等号前有两个空格,第二个只有一个空格。。。。。我也没有深入查看op到底是怎么拼成的,反正op真的有这两种情况。。。。然后就ok啦~~~~