Как я могу получить подклассы выделенного класса в 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, сгенерированный 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.


person Jun1987    schedule 22.11.2013    source источник


Ответы (1)


Я попытался воспроизвести вашу проблему, но не смог использовать ваш код, так как некоторые переменные во фрагменте не определены. Я думаю, проблема связана с используемым вами менеджером префиксов или именем класса. Следующий фрагмент предоставляет Adult в результате:

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)

person Ignazio    schedule 22.11.2013
comment
Спасибо за ответ, но у меня почему-то не работает. Он правильно получает класс Person, но не получает его подкласса. Я использовал Pellet Reasoner вместо FaCT++. Может ли быть дело? - person Jun1987; 02.12.2013
comment
Я решил эту проблему странным образом. Я создал файл OWL в формате 3.1.x и начал создавать онтологию с протеже. Затем протеже начал генерировать файл RDF в формате 3.1.x, а не в формате, который я разместил здесь выше. И тогда мой код отлично работал, как и код Игнацио. Пожалуйста, оставьте комментарий, если я должен закрыть этот вопрос. - person Jun1987; 02.12.2013
comment
Я не могу сказать, в чем разница между 3.1 и этим кодом. Я могу только предположить, что в IRI была какая-то опечатка, и воссоздание файла исправило это. - person Ignazio; 03.12.2013