У меня есть онтология, созданная в протеже 4.3.0 и хранящаяся в OWL-файле. Мне нужно добавить некоторых людей в эту онтологию и обновить этот файл. Поскольку эти люди очень похожи друг на друга, я бы хотел использовать API OWL, чтобы добавить их быстрее, чем ручное использование программы.Как обновить файл онтологии OWL, чтобы добавить нового человека с некоторыми свойствами?
Моя цель заключается в следующем:
- добавить новый индивидуальный
#individualSimpleSubType
- добавить тип
#SimpleSubType
к этому человеку (#SimpleSubType
подкласс#SimpleType
) - добавить следующее утверждение свойств объекта к этому физическое лицо:
#hasProperty1
, связанное с#PropertyValue1
- добавить следующее утверждение объекта недвижимости этому лицу:
#hasProperty2
asso лем, связанных с#PropertyValue2
Следующая информация уже присутствует в онтологии:
- класса
#SimpleType
и его подкласса#SimpleSubType
- свойства объекта
#hasProperty1
и#hasProperty2
- лица
#PropertyValue1
и#PropertyValue2
Ниже приведен код, который я использовал, чтобы попытаться достичь этой цели:
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
try {
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(new File("ontology.owl"));
IRI ontologyIRI = ontology.getOntologyID().getOntologyIRI();
PrefixManager prefixManager = new DefaultPrefixManager(ontologyIRI.toString().concat("#"));
OWLDataFactory dataFactory = manager.getOWLDataFactory();
OWLReasonerFactory reasonerFactory = new StructuralReasonerFactory();
OWLReasoner reasoner = reasonerFactory.createReasoner(ontology);
reasoner.precomputeInferences();
// Get all subclasses of SimpleType stored within the loaded ontology.
OWLClassNodeSet clsSimpleSubTypes = new OWLClassNodeSet();
OWLClass simpleTypeClass = dataFactory.getOWLClass(":SimpleType", prefixManager);
clsSimpleSubTypes.addDifferentEntities(reasoner.getSubClasses(simpleTypeClass, true).getFlattened());
// Get two object properties stored within the loaded ontology.
OWLObjectPropertyExpression objProperty1 = dataFactory.getOWLObjectProperty(IRI.create(ontologyIRI + "#hasProperty1"));
OWLObjectPropertyExpression objProperty2 = dataFactory.getOWLObjectProperty(IRI.create(ontologyIRI + "#hasProperty2"));
// Get two property values stored within the loaded ontology.
OWLNamedIndividual propertyValue1 = dataFactory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#PropertyValue1"));
OWLNamedIndividual propertyValue2 = dataFactory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#PropertyValue2"));
for (OWLClass cls : clsSimpleSubTypes.getFlattened())
{
if (cls.getIRI().toString().endsWith("#SimpleSubType")) {
// Create the new individual
OWLNamedIndividual po = factory.getOWLNamedIndividual(IRI.create(ontologyIRI + "#individualSimpleSubType"));
// individualSimpleSubType is of type SimpleSubType
OWLClassAssertionAxiom assertion = dataFactory.getOWLClassAssertionAxiom(cls, po);
manager.addAxiom(ontology, assertion);
// individualSimpleSubType has object property PropertyValue1
OWLObjectPropertyAssertionAxiom objProperty1Axiom = dataFactory.getOWLObjectPropertyAssertionAxiom(objProperty1, po, propertyValue1);
manager.addAxiom(ontology, objProperty1Axiom);
// individualSimpleSubType has object property PropertyValue2
OWLObjectPropertyAssertionAxiom objProperty2Axiom = dataFactory.getOWLObjectPropertyAssertionAxiom(objProperty2, po, propertyValue2);
manager.addAxiom(ontology, objProperty2Axiom);
break;
}
}
//File destinationFile = new File("ontology-new-data.owl");
//OWLOntologyFormat format = manager.getOntologyFormat(ontology);
//manager.saveOntology(ontology, format, IRI.create(destinationFile.toURI()));
manager.saveOntology(ontology);
} catch (OWLOntologyCreationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OWLOntologyStorageException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Однако, используя код выше, я получить другой результат, чем результат я получаю с помощью ставленника.
Если я использую протеже, чтобы добавить новый человек, как описано выше, файл OWL обновляются с добавлением следующих строк XML:
<!-- http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#individualSimpleSubType -->
<owl:NamedIndividual rdf:about="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#individualSimpleSubType">
<rdf:type rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#SimpleSubType"/>
<hasProperty1 rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#PropertyValue1"/>
<hasProperty2 rdf:resource="http://www.semanticweb.org/vincenzo/ontologies/2015/7/ontology.owl#PropertyValue2"/>
</owl:NamedIndividual>
Однако, если я использую приведенный выше код Java, экономя онтология также включает в себя модификацию других строк: в файл добавляются те же строки XML, что и выше, но также изменяются другие строки, как показано ниже.
Линии folliwing написаны в начале файла OWL, сохраненного вышеуказанным кодом Java (но эти строки не записываются, когда я сохраняю онтологию с помощью Protégé после выполнения тех же модификаций).
<!DOCTYPE rdf:RDF [
<!ENTITY terms "http://purl.org/dc/terms/" >
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY skos "http://www.w3.org/2004/02/skos/core#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
Затем, в атрибутах некоторых тегов добавлены некоторые префиксы, так:
- атрибуте
rdf:resource="&rdf;List"
исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
- устанавливается атрибут
rdf:resource="&owl;TransitiveProperty"
оригинального OWL файл заменяется наrdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"
- атрибут
rdf:about="&terms;description"
оригинального файла OWL заменяется наrdf:about="http://purl.org/dc/terms/description"
- атрибут
rdf:resource="&rdfs;Literal"
исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"
- устанавливается атрибут
rdf:resource="&xsd;hexBinary"
исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/2001/XMLSchema#hexBinary"
- устанавливается атрибут
rdf:resource="&xsd;string"
исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/2001/XMLSchema#string"
- устанавливается атрибут
rdf:resource="&skos;Concept"
из исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/2004/02/skos/core#Concept"
- устанавливается атрибут
rdf:resource="&skos;ConceptScheme"
исходного файла OWL заменяетсяrdf:resource="http://www.w3.org/2004/02/skos/core#ConceptScheme"
В чем причина этого странного поведения?
В моем проекте Eclipse я импортировал файл jar, связанный с OWL API 3.4.2, который является той же версией, интегрированной в Protegé 4.3.0.