以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  Jena Ontology API学习帖,问题帖[讨论]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=73423)


--  作者:csjcg2
--  发布时间:3/23/2009 5:58:00 PM

--  Jena Ontology API学习帖,问题帖[讨论]

最近在学习Jena Ontology API,由于参考资料不多,所以经常遇到问题无法解决。发这条贴子,跟大家讨论一下,希望高手能指点一二。

问题: 用protege建模,生成了一个owl Project(包含project文件和owl文件等),然后用Jena API来读取owl文件,并存入数据库。最后用Jena API的OntModel.listClasses把数据库里面的类读出来,不知道是不是因为本体库太大(有600多个concept),每次用Testcase测试的时候,都会报错:
java.lang.OutOfMemoryError: Java heap space
 at com.mysql.jdbc.PreparedStatement.<init>(PreparedStatement.java:406)
 at com.mysql.jdbc.Connection.clientPrepareStatement(Connection.java:2186)
 at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4766)
 at com.mysql.jdbc.Connection.prepareStatement(Connection.java:4671)
 at com.hp.hpl.jena.db.impl.SQLCache.doPrepareSQLStatement(SQLCache.java:289)
 at com.hp.hpl.jena.db.impl.SQLCache.getPreparedSQLStatement(SQLCache.java:271)
 at com.hp.hpl.jena.db.impl.SQLCache.getPreparedSQLStatement(SQLCache.java:318)
 at com.hp.hpl.jena.db.impl.PSet_TripleStore_RDB.find(PSet_TripleStore_RDB.java:843)
 at com.hp.hpl.jena.db.impl.SpecializedGraph_TripleStore.find(SpecializedGraph_TripleStore.java:141)
 at com.hp.hpl.jena.db.GraphRDB.graphBaseFind(GraphRDB.java:431)
 at com.hp.hpl.jena.graph.impl.GraphBase.find(GraphBase.java:224)
 at com.hp.hpl.jena.graph.compose.MultiUnion.graphBaseFind(MultiUnion.java:171)
 at com.hp.hpl.jena.graph.impl.GraphBase.find(GraphBase.java:224)
 at com.hp.hpl.jena.reasoner.FGraph.find(FGraph.java:42)
 at com.hp.hpl.jena.reasoner.FGraph.findWithContinuation(FGraph.java:61)
 at com.hp.hpl.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:89)
 at com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph.findDataMatches(FBRuleInfGraph.java:209)
 at com.hp.hpl.jena.reasoner.rulesys.impl.TopLevelTripleMatchFrame.<init>(TopLevelTripleMatchFrame.java:40)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:133)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:93)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine.generatorFor(LPBRuleEngine.java:266)
 at com.hp.hpl.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.init(ConsumerChoicePointFrame.java:71)
 at com.hp.hpl.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.<init>(ConsumerChoicePointFrame.java:60)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPInterpreter.setupTabledCall(LPInterpreter.java:671)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPInterpreter.run(LPInterpreter.java:565)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPInterpreter.next(LPInterpreter.java:187)
 at com.hp.hpl.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:239)
 at com.hp.hpl.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:226)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPBRuleEngine.pump(LPBRuleEngine.java:305)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward(LPTopGoalIterator.java:79)
 at com.hp.hpl.jena.reasoner.rulesys.impl.LPTopGoalIterator.next(LPTopGoalIterator.java:186)
 at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:68)

如果我不是读取用protege建立的owl文件,而是用Jena example里面的test1.owl,就没有问题。不知道有没有人遇到过类似的问题,如果有,请指教一下。谢谢。


--  作者:jpz6311whu
--  发布时间:3/23/2009 7:11:00 PM

--  
推理的OntModel不适合存储在数据库中,我曾经也遇到这种情况,要么把本体库改成不推理模式,要么不存储到数据库中。
--  作者:csjcg2
--  发布时间:3/23/2009 9:05:00 PM

--  
你的意思是如果需要推理的话,就不要用数据库存储本体?

难道直接从owl文件读取的OntModel处理推理速度会更快?

---------------------------------------------------------------------------

刚刚我提的错误已经解决,原因估计是频繁操作数据库导致内存中有大量的废弃对象,垃圾回收大量占用系统CPU。(好像是这样,超过98%就会报错,具体可以去查查有关垃圾收集机制)解决方法是:将jvm的参数修改一下 -xmx512m。但是虽然最终还是可以绿色通过,但是总耗时5分钟左右。


--  作者:jpz6311whu
--  发布时间:3/23/2009 9:42:00 PM

--  
以下是引用csjcg2在2009-3-23 21:05:00的发言:
你的意思是如果需要推理的话,就不要用数据库存储本体?

难道直接从owl文件读取的OntModel处理推理速度会更快?

---------------------------------------------------------------------------

刚刚我提的错误已经解决,原因估计是频繁操作数据库导致内存中有大量的废弃对象,垃圾回收大量占用系统CPU。(好像是这样,超过98%就会报错,具体可以去查查有关垃圾收集机制)解决方法是:将jvm的参数修改一下 -xmx512m。但是虽然最终还是可以绿色通过,但是总耗时5分钟左右。


是的,我以前也是遇到同样的情况,CPU满负荷运行过30分钟还没有完成,实在不得不放弃,处理的OWL大概几万triple的样子


--  作者:csjcg2
--  发布时间:3/23/2009 10:08:00 PM

--  
兄弟,你是对的。用数据库存储果然是比文件存储慢(在使用推理的情况下)

我使用的都是Jena提供的推理器。

推理器有三种 RDFS_INF  TRANS_INF  RULE_INF (当然还有一种就是没有推理器啦)

实验结果是用TRANS_INF的速度是最快的。

对OntModel的listSubClasses()这个方法而言的。

在文件读取OWL数据,TRANS_INF的推理器的设置下OntModel m = ModelFacotry.createOntModel(OntModelSpec.OWL_DL_MEM_TRANS_INF)
时间是1106ms。

文件里大约有600多个概念。还有100左右的子类声明。

有人用过Racer的推理机吗?如果用Racer,会不会比Jena自带的rule推理机还慢啊。。。

最后唉叹一下,这语义网搜索的速度也太慢了吧。。。。。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms