0

我的情况如下:

我使用一些 CCO 本体创建了一个基础本体,并为应用程序域添加了特定的类和属性(我们将其命名为基础本体)。

我已经使用 Java 和 OWLAPI 从 csv 数据库填充了这个本体创建实例及其属性(我们将其命名为完整的本体)。

当使用 SWRL API 对本体执行 SQWRL 查询时,会导致 Java 内存不足错误。我试图解决它,使用 Xmx 参数增加进程可用的内存。这还不够,我已经达到了我这台普通电脑所能做的极限。

如果我尝试在基础本体中进行查询(在创建数据库的所有个体之前),它可以毫无问题地工作。

如果我尝试从 Protégé 运行查询,则会发现同样的问题,它适用于基础本体,如果使用完整的本体,它将阻止程序。

使用 Protégé 推理器处理本体时,在本体中没有发现错误。HermiT 和 Pellet 都在几秒钟内运行基本本体。但是,就完整的本体而言,Pellet 也非常快(运行几秒钟),HermiT 处理本体大约需要 15 分钟。

这很奇怪,因为基础本体和填充本体的大小并没有太大的不同(大约 9000 个公理与 14000 个公理),即使创建的个体数量约为 2500。

我用来测试它的查询是:abox:caa(ClassName, ?i) -> sqwrl:select(?i)

我确信 SWRL API 正在识别命令,因为如果我引入了不正确的 ClassName(本体中不存在的类),程序会因命令错误而停止。但是如果命令是正确的,那么内存不足的问题就这样出现了

线程“主”java.lang.OutOfMemoryError 中的异常:org.drools.core.phreak.PhreakJoinNode.insertChildLeftTuple(PhreakJoinNode.java) 处的 Java 堆空间:480) 在 org.drools.core.phreak.PhreakJoinNode.doNode(PhreakJoinNode.java:71) 在 org.drools.core.phreak 的 org.drools.core.phreak.PhreakJoinNode.doLeftInserts(PhreakJoinNode.java:110)。 RuleNetworkEvaluator.switchOnDoBetaNode(RuleNetworkEvaluator.java:552) at org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:538) at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:373) at org .drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:333) 在 org.drools.core.phreak.RuleNetworkEvaluator.doRiaNode(RuleNetworkEvaluator.java:606) 在 org.drools.core。phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:533) at org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:373) at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:333)在 org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:169) 在 org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:127) 在 org.drools.core.phreak.RuleExecutor.reEvaluateNetwork (RuleExecutor.java:212) 位于 org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:34) 的 org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:87)。 core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43) 在 org.drools.core.common.DefaultAgenda。fireLoop(DefaultAgenda.java:1072) at org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:1019) at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1011) at org.drools .core.impl.StatefulKnowledgeSessionImpl.internalFireAllRules(StatefulKnowledgeSessionImpl.java:1321) at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1312) at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java :1304) 在 org.swrlapi.drools.core.DroolsSWRLRuleEngine.runRuleEngine(DroolsSWRLRuleEngine.java:211) 在 org.swrlapi.factory.DefaultSWRLRuleAndQueryEngine.run(DefaultSWRLRuleAndQueryEngine.java:90) 在 org.swrlapi.factory.DefaultSWRLRuleAndQueryEngine.runSQWRLQuery( DefaultSWRLRuleAndQueryEngine.java:118) 在 org.swrlapi.factory。默认SWRLRuleAndQueryEngine.runSQWRLQuery(DefaultSWRLRuleAndQueryEngine.java:156) 在 predict_maint.OntologyDataBase.main(OntologyDataBase.java:362)

我不明白为什么人们让本体变得如此难以处理......我想知道是否有人可以给我一些想法,告诉我这里可能出了什么问题,我怎么能设法在没有完整本体的情况下执行几个 SQWRL 查询使用大量内存并花费很长时间......

谢谢你。

4

0 回答 0