如何解决尝试在大型本体中执行 SQWRL 查询的问题
我的情况如下:
我使用一些 CCO 本体创建了一个基础本体,并为应用程序域添加了特定的类和属性(让我们将其命名为基础本体)。
我已经使用 Java 和 OWLAPI 从 csv 数据库填充了这个本体创建实例及其属性(让我们将其命名为完整本体)。
当使用 swrl API 对本体执行 SQWRL 查询时,它会导致内存不足的 Java 错误。我尝试使用 Xmx 参数增加进程可用的内存来解决它。这还不够,我已经达到了我的普通电脑所能做的极限。
如果我尝试在基础本体中进行查询(在创建数据库的所有个体之前),它可以正常工作。
如果我尝试从 Protégé 运行查询,也会发现同样的问题,它适用于基础本体,如果使用完整本体,它将阻塞程序。
使用 Protégé reasoner 处理本体时,本体中没有发现错误。 hermit 和 pellet 都在几秒钟内为基础本体运行。但是,对于完整本体而言,pellet 也非常快(几秒钟即可运行),hermit 处理本体大约需要 15 分钟。
这很奇怪,因为基础本体和填充本体的大小并没有太大区别(大约 9000 个公理 vs 14000 个公理),即使创建的个体数量约为 2500。
我用来测试它的查询是:aBox:caa(ClassName,?i) -> sqwrl:select(?i)
我确信 swrl API 正在识别命令,因为如果我引入了不正确的 ClassName(本体中不存在的类),程序会因命令错误的错误而停止。但是如果命令是正确的,那么内存不足的问题就会像这样
线程“main”中的异常 java.lang.OutOfMemoryError: Java heap space 在 org.drools.core.reteoo.NotNode.createLeftTuple(NotNode.java:121) 在 org.drools.core.phreak.PhreakJoinNode.insertChildLeftTuple(PhreakJoinNode.java:480) 在 org.drools.core.phreak.PhreakJoinNode.doLeftInserts(PhreakJoinNode.java:110) 在 org.drools.core.phreak.PhreakJoinNode.doNode(PhreakJoinNode.java:71) 在 org.drools.core.phreak.RuleNetworkEvaluator.switchOndobetaNode(RuleNetworkEvaluator.java:552) 在 org.drools.core.phreak.RuleNetworkEvaluator.evalBetaNode(RuleNetworkEvaluator.java:538) 在 org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:373) 在 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) 在 org.drools.core.phreak.RuleNetworkEvaluator.evalNode(RuleNetworkEvaluator.java:373) 在 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.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:87) 在 org.drools.core.concurrent.AbstractRuleEvaluator.internalEvaluateAndFire(AbstractRuleEvaluator.java:34) 在 org.drools.core.concurrent.SequentialRuleEvaluator.evaluateAndFire(SequentialRuleEvaluator.java:43) 在 org.drools.core.common.DefaultAgenda.fireLoop(DefaultAgenda.java:1072) 在 org.drools.core.common.DefaultAgenda.internalFireAllRules(DefaultAgenda.java:1019) 在 org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1011) 在 org.drools.core.impl.StatefulKNowledgeSessionImpl.internalFireAllRules(StatefulKNowledgeSessionImpl.java:1321) 在 org.drools.core.impl.StatefulKNowledgeSessionImpl.fireAllRules(StatefulKNowledgeSessionImpl.java:1312) 在 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.DefaultswrlRuleAndQueryEngine.runSQWRLQuery(DefaultswrlRuleAndQueryEngine.java:156) 在 predict_maint.OntologyDataBase.main(OntologyDataBase.java:362)
我不明白为什么这些人让本体如此难以处理......我想知道是否有人能给我一些关于这里可能有什么问题的想法,以及我如何设法对本体执行几个 SQWRL 查询完整本体,不占用大量内存,耗时长...
谢谢你。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。