耶拿; java 堆 space 迭代超类时出错

Jena; java heap space error when iterating superclasses

在 Eclipse 平台中使用 Jena,我正在为给定的 class 编写一段代码,获取其所有超级 classes。我知道常见的 Java 堆 space 问题并且我已经分配了 1 G.B 内存来完成任务,尽管它会触发:java.lang.OutOfMemoryError: Java heap space at java.util.ArrayList.<init>(Unknown Source)exception.

Here 是我正在使用的 ontology。

我的代码通常在第 8 次迭代后或更少时失败。谁能告诉我这样做的原因或该怎么办?我知道这个 ontology 有点大,但发生的事情合乎逻辑吗? (当我在没有推理机 'e.g. OWL_DL_MEM ' 的情况下使用 OntModelSpec 时,一切正常)。

ModelFactory model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF);
    this.model.read(convertPathToURI("some-path", "eu-car-rental.rdf"), "RDF/XML");     

    ExtendedIterator<OntClass> classes = getClassByURI("RentalAgreement").listSuperClasses();
    while (classes.hasNext()){
        OntClass oc = classes.next();
        System.out.println("something");
    }
    System.out.println("----finished----");

这里是函数 getClassByURI

public OntClass getClassByURI (String classURI)
{
    String myNS = model.getNsPrefixURI("");
    Resource r = model.getResource(myNS + classURI );       
    OntClass cls = (OntClass) r.as( OntClass.class );
    //System.out.println("++++++++++++  " + cls.getURI());
    //List<OntProperty> exItr = getClassProperties(cls,2, true);            
    return cls;
}

我可以重现你的问题。将来,请提供 完整的、最小的、有效的示例 。下面的代码就是很好的例子;任何人都可以复制它并 运行 它。代码:

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;

public class OWLSuperclassExample {
    public static void main(String[] args) {
        OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF);
        model.read("http://www.lsi.upc.edu/~%20oromero/EUCarRental.owl");
        OntClass rentalAgreement = 
            model.getOntClass("http://www.owl-ontologies.com/unnamed.owl#RentalAgreement");
        ExtendedIterator<OntClass> classes = rentalAgreement.listSuperClasses();
        while ( classes.hasNext() ) {
            System.out.println( "Superclass: " + classes.next() );
        }
        System.out.println("Completed.");
    }
}
Superclass: http://www.w3.org/2000/01/rdf-schema#Resource
Superclass: 75bdf39:14b07a39a79:-7f4c
Superclass: 75bdf39:14b07a39a79:-7f4b
Superclass: 75bdf39:14b07a39a79:-7f46
Superclass: 75bdf39:14b07a39a79:-7f4a
Superclass: 75bdf39:14b07a39a79:-7f4f
Superclass: http://www.w3.org/2002/07/owl#Thing
Superclass: 75bdf39:14b07a39a79:-7f4d
Superclass: 75bdf39:14b07a39a79:-7f47
Superclass: 75bdf39:14b07a39a79:-7f48
Superclass: 75bdf39:14b07a39a79:-7f50
Superclass: 75bdf39:14b07a39a79:-7f4e
Superclass: 75bdf39:14b07a39a79:-7f51
Superclass: 75bdf39:14b07a39a79:-7f49
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 92463104 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/taylorj/tmp/workspace/taylorj-jena-examples/hs_err_pid21802.log
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000deee4000, 92463104, 0) failed; error='Cannot allocate memory' (errno=12)

看起来这是 Jena 规则推理器中的某种错误,或者至少是意外行为。有几件事可能是罪魁祸首:

  1. Jena 的 OWL 推理器在设计上逻辑上不完整。这意味着他们不会得出合法的 OWL 结论。这是设计使然,因为使用基于规则的推理无法完全实现 OWL 语义。
  2. Jena 的 OWL 推理是 OWL1。如果此 ontology 包含 OWL2 的一部分,那可能会造成干扰。
  3. Jena 的 OWL 推理机适用于一种 OWL 完整推理机,它对可以出现的三元组的限制比 OWL DL 更少。可能会在您不希望的地方应用规则,这可能会造成干扰。