У меня есть список онтологий (ListofOntologiesName), я могу читать их одну за другой. В настоящее время, как вы видите в моем коде, я загружаю 1-ю онтологию, сохраняю ее классы, аксиомы, сущности, затем загружаю 2-ю онтологии, читаю ее классы, аксиомы и сущности и добавляю их к моим предыдущим переменным. Но этого недостаточно. Позже, в моем коде, мне нужно работать с «myOWLmodel», но, очевидно, в нем есть только моя последняя загруженная онтология, а не все.
Как прочитать несколько онтологий в одной модели?
P.S. Я не хочу иметь, например. «Set<OWLOntology> allModell = new HashSet();»
Потому что позже мне разрешили работать только с одной моделью из этого списка.
public static void BuildOnt(String ListofOntologiesName) {
OWLOntology myOWLmodel = null;
OwlOntologyManager owl = new OwlOntologyManager();
OWLOntologyID currentOntologyID = null;
ArrayList<OWLClass> tempClasses=new ArrayList<OWLClass>();
Set<OWLAxiom> tempaxioms = new HashSet<OWLAxiom> ();
Set<OWLEntity> tempEntities = new HashSet<OWLEntity> ();
try {
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
String[] nm = ListofOntologiesName.split("\n");
for (int ontID = 0; ontID < nm.length; ontID++) {
if (!nm[ontID].toString().equals("null")) {
String OntName = nm[ontID];
File file = new File(OntName);
myOWLmodel = manager.loadOntologyFromOntologyDocument(file);
Set<OWLAxiom> tempAx = myOWLmodel.getAxioms();
tempaxioms.addAll(tempAx);
ArrayList<OWLClass> classes = owl.getClasses(myOWLmodel);
tempClasses.addAll(classes);
Set<OWLEntity> ent = myOWLmodel.getSignature();
tempEntities.addAll(ent);
}
}
IRI ontologyIRI = IRI.create("http://www.semanticweb.org/mergedontology.owl");
IRI versionIRI = IRI.create(ontologyIRI + "/version1");
OWLOntologyID newOntologyID = new OWLOntologyID(ontologyIRI, versionIRI);
SetOntologyID setOntologyID = new SetOntologyID(myOWLmodel, newOntologyID);
manager.applyChange(setOntologyID);
currentOntologyID = myOWLmodel.getOntologyID();
} catch (Exception e) {
e.printStackTrace();
}
//Remaining of code:
//Do some processes on all Entities by "tempEntities", all axioms by "tempaxioms", and all classes by "tempClasses"
//Here I need more operation on "myOWLmodel", but it only saves the last loaded ontology
}
ОБНОВЛЕНИЕ:
Спасибо, я понял. ниже мой новый код:
public static OWLOntology ReadMultiOnt(String ListofOntologiesName) throws OWLOntologyCreationException {
// Create an empty ontology
OWLOntologyManager MergedManager = OWLManager.createOWLOntologyManager();
File fileM = new File("NameOfMyMergedOntology");
OWLOntology MergedOntology = MergedManager.loadOntologyFromOntologyDocument(fileM);
OWLOntologyManager tempManager = OWLManager.createOWLOntologyManager();
// Load each ontology, and add their axioms to my created empty ontology
String[] nm = ListofOntologiesName.split("\n");
for (int ontID = 0; ontID < nm.length; ontID++) {
if (!nm[ontID].toString().equals("null")) {
String OntName = nm[ontID];
File file = new File(OntName);
OWLOntology tempOntology = tempManager.loadOntologyFromOntologyDocument(file);
Set<OWLAxiom> tempAx = tempOntology.getAxioms();
MergedManager.addAxioms(MergedOntology, tempAx);
}
}
return MergedOntology;
// After that, I am able to do any process of all axioms, objects etc of all input ontologies
}
Ваш вопрос непонятен: "Я не хочу иметь, например, "Set setowlModle = new HashSet();"" "не хочу" или "хочу"?
В чем проблема иметь набор онтологий? Если вы хотите построить объединённую онтологию, что это:
manager.applyChange(setOntologyID);
— это бесполезно. Почему бы вам НЕ добавить все аксиомы в новую онтологиюmergedOntology
, которую вы создаете перед загрузкой онтологий? Это довольно прямолинейноВаш стиль кода далек от передовой практики... стиль верблюжьего регистра имен методов и имен переменных, сами имена переменных должны четко указывать тип объекта и т. д.
У меня есть все аксиомы из входных онтологий в «tempaxioms», но для любых других операций, где мне нужно вызвать модель или фабрику OWLontology и т. д., у меня есть только информация о последней загруженной онтологии. Например, «myOWLmodel.getObjectPropertiesInSignature()» возвращает только свойства объекта последней онтологии.
Извините, я исправляю это, я не хочу иметь набор модели owlontology. Например, если у меня есть Set<OWLOntology> allModell = new HashSet<OWLOntology>(); Затем, если я вызову Iterator<OWLOntology> iter = allModell.iterator(); Set<OWLObjectProperty> seperatedObj = iter.next().getObjectPropertiesInSignature(); Для любого процесса, такого как getObject, он дает мне отдельный список.
И вы можете объединить любой из этих списков в один список... Я не вижу здесь проблемы, это базовая Java. В любом случае, я рассказал вам, как это сделать. 1) создать пустую онтологию
o
2) для каждой загружаемой онтологииo_i
добавить ее аксиомы вo
.OWLOntologyManager
предоставляет все эти методы.Спасибо, меня смутило сохранение всех операций вместо сохранения всей онтологии. Я обновляю свой код. Спасибо еще раз.
Вместо добавления «[решено]» к заголовку и редактирования вопроса опубликуйте свой ответ и примите его.