Как я могу получить подклассы выделенного класса в OWLapi?
Я пытаюсь написать метод, который загружает подклассы входного класса. Этот код прекрасно работал с файлом RDF, написанным OWL API 3.1.x(Pizza.owl), но теперь он не работает с файлом, созданным версией OWL API 3.4.x.
Ниже приведен код, который я написал:
public ArrayList<String> getSubClassOf(String parentClass)
{
String seq = "";
tempList.clear();
tempClass = factory.getOWLClass(":" + parentClass, pm);
s = reasoner.getSubClasses(tempClass, false);
i = s.iterator();
while(i.hasNext()){
seq = i.next().toString();
if(!seq.contains("Nothing"))
tempList.add(seq.substring(seq.indexOf("#")+1,seq.indexOf(">")));
}
return tempList;
}
Это файл совы, сгенерированный OWL API 3.4.2:
<!DOCTYPE Ontology [
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY xml "http://www.w3.org/XML/1998/namespace" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<Ontology xmlns="http://www.w3.org/2002/07/owl#"
xml:base="http://localhost/CA/SmartHome/SmartHome_1113"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
ontologyIRI="http://localhost/CA/SmartHome/SmartHome_1113">
<Prefix name="" IRI="http://localhost/CA/SmartHome/SmartHome_1113.owl#"/>
<Prefix name="owl" IRI="http://www.w3.org/2002/07/owl#"/>
<Prefix name="rdf" IRI="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
<Prefix name="xsd" IRI="http://www.w3.org/2001/XMLSchema#"/>
<Prefix name="rdfs" IRI="http://www.w3.org/2000/01/rdf-schema#"/>
<Declaration>
<Class IRI="#Adult"/>
</Declaration>
<Declaration>
<Class IRI="#Person"/>
</Declaration>
<SubClassOf>
<Class IRI="#Adult"/>
<Class IRI="#Person"/>
</SubClassOf>
</Ontology>
Это довольно простая онтология, состоящая из 2 классов, а Adult - это подкласс Person
1 ответ
Я попытался воспроизвести вашу проблему, но не смог использовать ваш код, так как некоторые переменные не определены во фрагменте. Я думаю, что проблема связана с используемым вами менеджером префиксов или именем класса. Следующий фрагмент предоставляет Взрослый в результате:
public static void main(String[] args) throws Exception {
OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
// load the importing ontology
OWLOntology ontology = manager.loadOntologyFromOntologyDocument(new StringDocumentSource(test_owl));
OWLReasoner r = new FaCTPlusPlusReasonerFactory().createReasoner(ontology);
OWLClass person = ontology.getOWLOntologyManager().getOWLDataFactory().getOWLClass(IRI.create("http://localhost/CA/SmartHome/SmartHome_1113#Person"));
Set<OWLClass> classes = r.getSubClasses(person, false).getFlattened();
System.out.println(classes);
}
Выход:
[<http://localhost/CA/SmartHome/SmartHome_1113#Adult>, owl:Nothing]
Обратите внимание, что вам не нужно анализировать строки, чтобы получить желаемый результат. У OWLEntity есть метод, чтобы определить, соответствует ли он ничему, и вы можете получить фрагмент IRI с помощью OWLEntity.getIRI().getFragment()
Онтология должна быть действительной как с 3.1, так и с 3.4.x (я использовал 3.4.8)