Создание правил SWRL в онтологии OWLAPI
Я выполнил (в Neatbeans 8.2) следующий простой Java-код, чтобы поэкспериментировать с языком SWRL:
String base = "http://www.prova/testont.owl";
IRI ontologyIRI = IRI.create(base);
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
OWLOntology ontology = manager.createOntology(ontologyIRI);
OWLDataFactory factory = manager.getOWLDataFactory();
OWLClass adult = factory.getOWLClass(IRI.create(ontologyIRI + "#Adult"));
OWLClass person = factory.getOWLClass(IRI.create(ontologyIRI + "#Person"));
OWLDataProperty hasAge = factory.getOWLDataProperty(IRI.create(ontologyIRI + "#hasAge"));
OWLNamedIndividual john = factory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#John"));
OWLNamedIndividual andrea = factory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#Andrea"));
OWLClassAssertionAxiom classAssertion = factory.getOWLClassAssertionAxiom(person, john);
manager.addAxiom(ontology, classAssertion);
classAssertion = factory.getOWLClassAssertionAxiom(person, andrea);
manager.addAxiom(ontology, classAssertion);
OWLDatatype integerDatatype = factory.getOWLDatatype(OWL2Datatype.XSD_INTEGER.getIRI());
OWLLiteral literal = factory.getOWLLiteral("41", integerDatatype);
OWLAxiom ax = factory.getOWLDataPropertyAssertionAxiom(hasAge, andrea, literal);
manager.addAxiom(ontology, ax);
literal = factory.getOWLLiteral("15", integerDatatype);
ax = factory.getOWLDataPropertyAssertionAxiom(hasAge, john, literal);
manager.addAxiom(ontology, ax);
SWRLRuleEngine ruleEngine = SWRLAPIFactory.createSWRLRuleEngine(ontology);
ruleEngine.createSWRLRule("r1", "Person(?p)^hasAge(?p,?age)^swrlb:greaterThan(?age,17) -> Adult(?p)");
manager.saveOntology(ontology, IRI.create(((new File("FILE_PATH")).toURI())));
Я использовал maven со следующей зависимостью:
<dependency>
<groupId>edu.stanford.swrl</groupId>
<artifactId>swrlapi-drools-engine</artifactId>
<version>1.1.4</version>
</dependency>
Я получаю следующую ошибку:
Исключение в потоке "main" org.swrlapi.parser.SWRLParseException: недопустимый предикат атома SWRL 'Person' в org.swrlapi.parser.SWRLParser.generateEndOfRuleException(SWRLParser.java:479) в org.swrlapi.parS.ParSPRLSserver 0 DefaultSWRLAPIOWLOntology.
Однако, если я сохраняю онтологию в файле, а затем перезагружаю ее, я больше не получаю ошибку. Кажется, префиксы по умолчанию добавляются при первом сохранении. Это звучит довольно странно для меня....
Пожалуйста, не могли бы вы помочь мне понять, что я делаю не так?
Спасибо заранее, Андреа
1 ответ
При сохранении и анализе относительные IRI, такие как "Person", будут преобразованы в абсолютные IRI с использованием онтологического IRI в качестве основы.