2015-08-26 3 views
2

У меня есть онтология, созданная в протеже 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#" > 
]> 

Затем, в атрибутах некоторых тегов добавлены некоторые префиксы, так:

  1. атрибуте rdf:resource="&rdf;List" исходного файла OWL заменяется rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
  2. устанавливается атрибут rdf:resource="&owl;TransitiveProperty" оригинального OWL файл заменяется на rdf:resource="http://www.w3.org/2002/07/owl#TransitiveProperty"
  3. атрибут rdf:about="&terms;description" оригинального файла OWL заменяется на rdf:about="http://purl.org/dc/terms/description"
  4. атрибут rdf:resource="&rdfs;Literal" исходного файла OWL заменяется rdf:resource="http://www.w3.org/2000/01/rdf-schema#Literal"
  5. устанавливается атрибут rdf:resource="&xsd;hexBinary" исходного файла OWL заменяется rdf:resource="http://www.w3.org/2001/XMLSchema#hexBinary"
  6. устанавливается атрибут rdf:resource="&xsd;string" исходного файла OWL заменяется rdf:resource="http://www.w3.org/2001/XMLSchema#string"
  7. устанавливается атрибут rdf:resource="&skos;Concept" из исходного файла OWL заменяется rdf:resource="http://www.w3.org/2004/02/skos/core#Concept"
  8. устанавливается атрибут 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.

ответ

2

Проблема заключается в том, что префиксы в оригинальной онтологии не сохраняются при чтении ее из файла. Это было исправлено в более поздних версиях OWL API. 3.5.2 и 4.0.2 (4.1.0 еще не выпущены) должны позволить вам найти префиксы, установленные в объекте формата онтологии.

Для того, чтобы гарантировать, что эти префиксы используются для лиц, а также (для вещей, как &rdf;, например), вы должны позвонить

XMLWriterPreferences.getInstance().setUseNamespaceEntities(true);

перед сохранением онтологии.

Обратите внимание, что это не семантические различия - они являются синтаксическими различиями только на уровне XML. Онтологии семантически эквивалентны, являются ли префиксы сокращенными для сущностей или нет.