Использование SWRL с Jena и Pellet

Мне не удалось найти несколько приличных простых примеров использования SWRL и Jena с Pellet или, по крайней мере, использования SWRL? Я изучил несколько примеров в документации Pellet, но там нет примера использования SWRL. Большинство примеров в Интернете неполные и запутанные.

Единственное решение, которое я нашел, было с Jess Rule Engine, но оно платное и находится под коммерческой лицензией. Я обнаружил, что Pellet поддерживает правила SWRL, но не смог найти работающий пример.

Единственный пример, который я нашел, это это, но я его не понимаю:

OWLOntologyManager m = create();
OWLOntology o = m.createOntology(example_iri);
// Get hold of references to class A and class B.
OWLClass clsA = df.getOWLClass( IRI.create(example_iri +    "#A" ));
OWLClass clsB = df.getOWLClass(IRI.create(example_iri +    "#B"    ));
SWRLVariable var = df.getSWRLVariable(IRI.create(example_iri + "#x" ));
SWRLClassAtom body = df.getSWRLClassAtom(clsA, var);
SWRLClassAtom head = df.getSWRLClassAtom(clsB, var);
SWRLRule rule = df.getSWRLRule(Collections.singleton(body),
Collections.singleton(head));
m.applyChange(new AddAxiom(o, rule));

person Ali Ahmad    schedule 28.06.2013    source источник


Ответы (2)


Правила гранул и правила Йены очень разные

Короткий ответ заключается в том, что Pellet поддерживает правила SWRL. Если у вас есть онтология, содержащая правила SWRL, и вы попросите Pellet проанализировать ее, он примет их во внимание.

В Jena есть собственный язык правил, который описан на странице документации, Резонеры и механизмы правил: поддержка выводов Jena< /а>. Он поддерживает как прямые, так и обратные правила цепочки.

Однако, хотя и Pellet, и Jena поддерживают понятие правил, предполагаемые домены правил SWRL и правил Jena сильно различаются. Правила SWRL являются конструкциями уровня OWL; унарные предикаты в правиле SWRL — это выражения класса, а бинарные предикаты — это свойства объекта и данных. Кроме того, правила SWRL соответствуют только указанным лицам; они не подходят для людей, существование которых только предполагается. С другой стороны, правила Jena относятся к уровню RDF и предназначены для работы с RDF-графами. Хотя RDF и OWL часто используются вместе (например, данные OWL сериализуются в RDF), они концептуально различны. Можно реализовать механизм рассуждений OWL, не использующий RDF, и механизм SWRL, который не использует графы RDF.

Jena или OWL API?

Код, который вы показали, основан на наличии OWLOntologyManager. основан на API OWL, а не на API Jena. API OWL будет иметь более прямую функциональность для работы с правилами OWL и SWRL, а Jena — нет. (Jena's OntModels хорошо работает с OWL1, но поддержка OWL2 не полная (и все еще «открыта для участников»).

Вместо того, чтобы использовать API OWL или пытаться использовать API Jena, вам, вероятно, будет проще создавать правила с помощью редактора, такого как Protégé. Мартин Куба написал очень хороший учебник по OWL2 и SWRL, который может помочь вам в этом.

person Joshua Taylor    schedule 28.06.2013
comment
Я протестировал некоторые правила SWRL с Protege 4.3, будут ли они работать с Pellet. Во-вторых, что является альтернативой для SWRL - person Ali Ahmad; 28.06.2013
comment
Насколько я знаю, @AliAhmad Protégé 4.3 работает с Pellet. Существует SPIN правила, основанные на SPARQL. (Я не использовал их и не могу прокомментировать их.) - person Joshua Taylor; 28.06.2013
comment
@alex Навскидку, я точно не помню, поддерживает ли протеже 4 SWRL, но я думаю, что да. Однако я не думаю, что соответствующая вкладка отображается по умолчанию. Его нужно включить (меню типа «Показать вид» или что-то в этом роде), и у него нет очевидного имени, он просто называется «Правила». - person Joshua Taylor; 25.07.2016
comment
@Alex А, да, нашел. См. последнюю запись в [Часто задаваемые вопросы о Protege 4 OWL](protegewiki.stanford.edu/wiki/ Protege-OWL_4_FAQ], Как редактировать/использовать Правила SWRL в Protege?. Он начинается с процесса Создать новую вкладку (Окно -> Виды -> Создать новую вкладку...) с именем что-то вроде Rules, SWRL или как вам больше нравится. - person Joshua Taylor; 25.07.2016
comment
@JoshuaTaylor, но эта вкладка редактора правил кажется несовместимой с правилами SWRL. Пожалуйста, посмотрите здесь - person alex; 26.07.2016

Правила SWRL работают с Pellet API. Я создал свою онтологию и правила SWRL с помощью Protégé и смог динамически создавать индивидуумов OWL с помощью кода Java. Вся эта онтология используется как aggregatedOwl в следующем коде. Этот код загружает онтологию (базовый OWL + отдельные лица, если таковые имеются + правила SWRL) и запускает на нем механизм рассуждения Pellet и сохраняет полученный результат в строке.

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.StringDocumentTarget;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.util.InferredAxiomGenerator;
import org.semanticweb.owlapi.util.InferredOntologyGenerator;
import org.semanticweb.owlapi.util.InferredPropertyAssertionGenerator;
import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;

try {
    manager = OWLManager.createOWLOntologyManager();

    InputStream owlInputStream = new ByteArrayInputStream(aggregatedOwl.getBytes("UTF-8"));
    inferredOntology = manager.loadOntologyFromOntologyDocument(owlInputStream);

    PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner(inferredOntology);
    reasoner.getKB().realize();

    List<InferredAxiomGenerator<? extends OWLAxiom>> axiomGenerators = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
    axiomGenerators.add( new InferredPropertyAssertionGenerator() );

    InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner,axiomGenerators);
    iog.fillOntology(manager, inferredOntology);

    // Save the new ontology
    OutputStream owlOutputStream = new ByteArrayOutputStream();
    manager.saveOntology(inferredOntology, owlOutputStream);
    inferredData = owlOutputStream.toString();
}
catch ( Exception e ) {
    throw new Exception("Exception occurred in applying reasoner");
}

Надеюсь, это будет полезно для вас.

person Swamy    schedule 03.07.2013
comment
Я нахожу ваш код запутанным! Вы смешиваете Jena и OwlApi в своем импорте, но не используете импорт Jena. - person PCoder; 24.06.2014
comment
Спасибо за указание, я не удалял ненужный импорт из своего фрагмента кода. Я отредактировал свой ответ. надеюсь, что сейчас все в порядке. - person Swamy; 25.06.2014