Обоснование онтологии с использованием OWL API

Я использовал OWL API 4.1.3 для загрузки своей небольшой онтологии. Поскольку мне нужно использовать предполагаемую информацию, я также провел рассуждения, используя библиотеку Hermit 1.3.8.413. Следующий код показывает, как я это сделал.

public class ReasonRDF {

public static void main(String[] args) throws OWLOntologyCreationException, OWLOntologyStorageException {

    readRDF("C:/Users/workspace/Ontology_matching/NVDB_Matching_v18_H_4_1_CONVERTYING/results/NewInstantiated/owl/OSM1.owl");

}
public static void readRDF(String address) throws OWLOntologyCreationException, OWLOntologyStorageException{
    OWLOntologyManager manager =OWLManager.createOWLOntologyManager();
    File file = new File (address);
    OWLOntology ont = manager.loadOntologyFromOntologyDocument(IRI.create(file));
    System.out.println("Ontology Loaded...");

    System.out.println("Logical IRI   : " + ont.getOntologyID());
    System.out.println("Format        : " + manager.getOntologyFormat(ont));
    System.out.println("Runtime memory: " + Runtime.getRuntime().totalMemory());      
      ReasonerFactory reasonerFactory = new ReasonerFactory();
      ConsoleProgressMonitor progressMonitor = new ConsoleProgressMonitor();
      Configuration config = new Configuration();
      config.ignoreUnsupportedDatatypes=true;
      config.reasonerProgressMonitor= progressMonitor;
      OWLReasoner reasoner = reasonerFactory.createReasoner(ont, config);


      long t0 = System.nanoTime();

      System.out.println("Starting to add axiom generators");
      OWLDataFactory datafactory = manager.getOWLDataFactory();
      List<InferredAxiomGenerator<? extends OWLAxiom>> inferredAxioms = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
      //inferredAxioms.add(new InferredSubClassAxiomGenerator());
      inferredAxioms.add(new InferredClassAssertionAxiomGenerator());
      //inferredAxioms.add(new InferredDataPropertyCharacteristicAxiomGenerator());
      //inferredAxioms.add(new InferredObjectPropertyCharacteristicAxiomGenerator());
      //inferredAxioms.add(new InferredEquivalentClassAxiomGenerator());
      //inferredAxioms.add(new InferredPropertyAssertionGenerator());
      //inferredAxioms.add(new InferredInverseObjectPropertiesAxiomGenerator());         
      inferredAxioms.add(new InferredSubDataPropertyAxiomGenerator());
      inferredAxioms.add(new InferredSubObjectPropertyAxiomGenerator());
      System.out.println("finished adding axiom generators");

//        List<InferredIndividualAxiomGenerator<? extends OWLIndividualAxiom>> individualAxioms= new ArrayList<InferredIndividualAxiomGenerator<? extends OWLIndividualAxiom>>();
//        inferredAxioms.addAll(individualAxioms);

    // for writing inferred axioms to the new ontology
    OWLOntology infOnt = manager.createOntology(IRI.create(ont.getOntologyID().getOntologyIRI().get()+"_inferred"));

      // use generator and reasoner to infer some axioms
      System.out.println("Starting to infer");
      InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, inferredAxioms);
      //InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner);

      System.out.println("Inferrence is over");

      System.out.println("Storing the results");
      iog.fillOntology(datafactory,infOnt);
      System.out.println("Results are stored");
      long elapsed_time = System.nanoTime()-t0;
      System.out.println(elapsed_time);

      // save the ontology
      manager.saveOntology(infOnt, IRI.create("file:///C:/Users/ontologies/NVDB4_test.rdf"));
    }
}

Он не выдает никаких ошибок, но для сохранения выведенной онтологии в новом файле требуется вечность. На самом деле он не завершает работу даже через 2 дня. Моя IDE — eclipse EE, и я выделил от 6 до 12 ГБ памяти для запуска этого приложения. Я не могу найти никаких проблем с моим кодом или моей онтологией.

Может ли кто-нибудь предложить оптимизацию или, может быть, даже лучший способ реализации или другой API?

вот моя онтология на случай, если кто-то захочет ее протестировать.


person msc87    schedule 09.01.2017    source источник
comment
Не могли бы вы уточнить: количество терминов в вашей онтологии и количество отношений в вашей онтологии. Кроме того, знаете ли вы, на какие строки (линии) он потратил больше всего времени на выполнение?   -  person sloppypasta    schedule 09.01.2017
comment
В моей онтологии 15426 аксиом, включая аксиомы об индивидуумах, SWRL, изменении свойств, GCA и замыкании. Кажется, что самая трудоемкая часть — это этап хранения.   -  person msc87    schedule 10.01.2017


Ответы (1)


Размер онтологии слабо связан со сложностью рассуждений о ней — некоторые маленькие онтологии гораздо сложнее для рассуждающих, чем другие очень большие. (Конечно, возможна и ошибка).

Можете ли вы поделиться содержанием онтологии?

Изменить: попробовав онтологию, похоже, что размер не имеет большого значения; с онтологией довольно сложно рассуждать.

Я попытался отключить правила SWRL и пропустить генерацию утверждения класса, но все равно столкнулся с препятствием. Количество и топология свойств объекта достаточны, чтобы сильно напрячь HermiT.

Я пробовал версию 1.3.8.500 на случай каких-либо проблем в OWLAPI, которые могли быть исправлены в обновленных версиях; единственный значительный результат, который я получил, заключается в том, что код не работает с привязкой к памяти. 3 гигабайта оперативной памяти, выделенной виртуальной машине, кажется, более чем достаточно.

Кажется, что рассуждения, связанные с непересекающимися связями, занимают много времени — это не является неожиданным. Подумайте, можете ли вы удалить непересекающиеся аксиомы из своей онтологии и при этом выполнить свои требования.

Также подумайте, имеет ли смысл разделять индивидуумов путем разделения ABox — если есть индивидуумы, которые, как вы уверены, не связаны между собой, было бы неплохо разделить утверждения в нескольких онтологиях. Большое количество не связанных между собой людей может заставлять рассуждающего пытаться мыслить путями, которые никогда не приведут к полезным выводам.

person Ignazio    schedule 10.01.2017
comment
Я добавил ссылку на свою онтологию в вопросе. - person msc87; 10.01.2017
comment
как я могу разбить свою онтологию? Я хочу извлечь экземпляры, которые связаны с целевым экземпляром на расстоянии одного или двух отношений. - person msc87; 14.07.2017