Я пытаюсь запустить проверку согласованности на непоследовательную онтологию, для которой Pellet и Hermit Reasoner не дают несогласованности. Однако Protege успешно отмечает несогласованные классы. В деталях я меняю правила SBVR на OWL 2.0. Итак, мои правила: Необходимо, чтобы car_rental is_insured_by at_least 3 credit_card; Необходимо, чтобы car_rental is_insured_by at_least 5 credit_card;Protege отмечает, что онтология несовместима, однако Отшельник и Пелле Reasoner не
Соответствующей онтология
Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(ns:=<http://isd.ktu.lt/semantika/>)
Ontology(<http://isd.ktu.lt/semantika/s2o>
Declaration(AnnotationProperty(<ns:s2o#label_sbvr>))
Declaration(AnnotationProperty(<ns:s2o#label_en>))
Declaration(Class(<ns:s2o#car_rental>))
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#car_rental> "car_rental"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#car_rental> "car rental"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#car_rental> "car rental")
ClassAssertion(<ns:s2o#car_rental> <ns:s2o#Car>)
Declaration(Class(<ns:s2o#credit_card>))
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#credit_card> "credit_card"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#credit_card> "credit card"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#credit_card> "credit card")
ClassAssertion(<ns:s2o#credit_card> <ns:s2o#Credit>)
Declaration(ObjectProperty(<ns:s2o#is_insured_by__credit_card>))
ObjectPropertyDomain(<ns:s2o#is_insured_by__credit_card> <ns:s2o#car_rental>)
ObjectPropertyRange(<ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>)
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#is_insured_by__credit_card> "car_rental is_insured_by credit_card"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#is_insured_by__credit_card> "car rental is insured by credit card"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#is_insured_by__credit_card> "car rental is insured by credit card")
SubClassOf(<ns:s2o#car_rental> ObjectMinCardinality(3 <ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>))
SubClassOf(<ns:s2o#car_rental> ObjectMinCardinality(5 <ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>))
)
Отшельника и пеллеты отмечают онтологию как последовательные, где, как Protege помечает оба класса как несовместимые.
Теперь, если я возьму свои SBVR правила, чтобы быть следующим
Это необходимо, чтобы car_rental is_insured_by at_most 3 CREDIT_CARD; Необходимо, чтобы car_rental is_insured_by at_least 5 credit_card;
Соответствующая онтология
Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)
Prefix(ns:=<http://isd.ktu.lt/semantika/>)
Ontology(<http://isd.ktu.lt/semantika/s2o>
Declaration(AnnotationProperty(<ns:s2o#label_sbvr>))
Declaration(AnnotationProperty(<ns:s2o#label_en>))
Declaration(Class(<ns:s2o#car_rental>))
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#car_rental> "car_rental"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#car_rental> "car rental"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#car_rental> "car rental")
ClassAssertion(<ns:s2o#car_rental> <ns:s2o#Car>)
Declaration(Class(<ns:s2o#credit_card>))
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#credit_card> "credit_card"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#credit_card> "credit card"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#credit_card> "credit card")
ClassAssertion(<ns:s2o#credit_card> <ns:s2o#Credit>)
Declaration(ObjectProperty(<ns:s2o#is_insured_by__credit_card>))
ObjectPropertyDomain(<ns:s2o#is_insured_by__credit_card> <ns:s2o#car_rental>)
ObjectPropertyRange(<ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>)
AnnotationAssertion(<ns:s2o#label_sbvr> <ns:s2o#is_insured_by__credit_card> "car_rental is_insured_by credit_card"@en)
AnnotationAssertion(<http://www.w3.org/2000/01/rdf-schema#label> <ns:s2o#is_insured_by__credit_card> "car rental is insured by credit card"@en)
AnnotationAssertion(<ns:s2o#label_en> <ns:s2o#is_insured_by__credit_card> "car rental is insured by credit card")
SubClassOf(<ns:s2o#car_rental> ObjectMinCardinality(5 <ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>))
SubClassOf(<ns:s2o#car_rental> ObjectMaxCardinality(3 <ns:s2o#is_insured_by__credit_card> <ns:s2o#credit_card>))
)
На этот раз Отшельник и пеллетах оба работают прекрасно, как это делает Protege.
Я прилагаю мой отшельник код, а для справки,
import java.io.File;
import java.util.Set;
import org.semanticweb.HermiT.Configuration;
import org.semanticweb.HermiT.Reasoner;
import org.semanticweb.HermiT.Reasoner.ReasonerFactory;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.reasoner.InconsistentOntologyException;
import org.semanticweb.owlapi.reasoner.Node;
import org.semanticweb.owlapi.reasoner.OWLReasoner;
import org.semanticweb.owlapi.reasoner.OWLReasonerFactory;
import com.clarkparsia.owlapi.explanation.BlackBoxExplanation;
import com.clarkparsia.owlapi.explanation.ExplanationGenerator;
import com.clarkparsia.owlapi.explanation.HSTExplanationGenerator;
public class Demo {
public void reason() throws OWLOntologyCreationException {
// First, we create an OWLOntologyManager object. The manager will load and save ontologies.
OWLOntologyManager m = OWLManager.createOWLOntologyManager();
OWLDataFactory dataFactory=m.getOWLDataFactory();
File inputOntologyFile = new File("C:\\Users\\1047785\\Desktop\\HermiT\\Input12.owl");
OWLOntology o=m.loadOntologyFromOntologyDocument(inputOntologyFile);// Now, we instantiate HermiT by creating an instance of the Reasoner class in the package org.semanticweb.HermiT.
Set<OWLClass> cl = o.getClassesInSignature();
//System.out.println(cl);
ReasonerFactory factory = new ReasonerFactory();
Configuration configuration=new Configuration();
configuration.throwInconsistentOntologyException = false;
OWLReasoner reasoner=factory.createReasoner(o, configuration);
BlackBoxExplanation exp=new BlackBoxExplanation(o, factory, reasoner);
HSTExplanationGenerator multExplanator=new HSTExplanationGenerator(exp);
for (OWLClass c : cl) {
System.out.println(c);
System.out.println(reasoner.isSatisfiable(c));
Set<Set<OWLAxiom>> explanations = null;
try {
explanations =multExplanator.getExplanations(c);
}
catch (Exception e) {
/*for (Set<OWLAxiom> explanation : explanations) {
System.out.println("------------------");
System.out.println("Axioms causing the unsatisfiability: ");
for (OWLAxiom causingAxiom : explanation) {
System.out.println(causingAxiom);
}
System.out.println("------------------");
}*/
continue;
}
for (Set<OWLAxiom> explanation : explanations) {
System.out.println("------------------");
System.out.println("Axioms causing the unsatisfiability: ");
for (OWLAxiom causingAxiom : explanation) {
System.out.println(causingAxiom);
}
System.out.println("------------------");
}
}
Я в недоумении для такого поведения.
Да, все трое из них дают неудовлетворительные во втором случае. В случае первой онтологии, почему Protege отмечает это как неудовлетворительное? Поскольку мои правила SBVR контрастируют, я надеялся, что моя онтология сделает то же самое, нет ли способа добиться неудовлетворенности в первой онтологии? –
Какой аргумент использует Protege в первом случае? Protege делает только очень ограниченные выводы сам по себе, он полагается на аргументацию для самых сложных умозаключений, как это было бы. – Ignazio
Используется Пеллет. –