apache-jena-2.12.1: getSubClass не может прочитать все подклассы

Я изучаю Йену для веб-семантики. Я попробовал сделать функцию getAllSubClass для онтологии чтения (.owl), которую я сделал.

уровень1->уровень2 подкласс уровень1->уровень3 подкласс уровень2->уровень4 подкласс уровень3->уровень5 подкласс уровень4

это мой код:

public void getAllSubClass(String class)
    {
        String temp = uri+""+class;
        OntClass classOwl = ontology.getOntClass(temp);
        do
        {
            System.out.println(classOwl.getLocalName());
            temp = uri+""+classOwl.getLocalName();
            classOwl = ontology.getOntClass(temp);
            classOwl = classOwl.getSubClass();
        }while(!classOwl.getLocalName().equals((Object)"Nothing"));
    }

если выход класса level1/level2/level3 всегда останавливается на уровне 3, если класс level4 выход level4-level5

что мне делать с моим кодом для получения вывода level1...level5?


person Bima Wijaya    schedule 03.03.2015    source источник


Ответы (1)


Я работал над этой проблемой, я создал класс JenaHelper, который анализирует файл Ontologoy (.owl), созданный с помощью Protege. Это поможет вам, я надеюсь, я разработал методы для извлечения всех понятий, отношений понятий, всех значений и значений конкретного понятия.

public class JenaHelper {

    public JenaHelper() {

    }

    public static Set<String> getConceptsNames(Model model, String uri) {
        Set<String> conceptsName = new HashSet<String>();
        StmtIterator sIter = model.listStatements();
        for (; sIter.hasNext();) {
            Statement stmt = sIter.nextStatement();
            String subject = stmt.getSubject().toString();
            String predicat = stmt.getPredicate().toString();
            String object = stmt.getObject().toString();
            if (subject.contains(uri) || predicat.contains(uri) || object.contains(uri)) {
                String s = subject.substring(subject.indexOf("#") + 1);
                String p = predicat.substring(predicat.indexOf("#") + 1);
                String o = object.substring(object.indexOf("#") + 1);
                if ("subClassOf".equals(p) && !s.toLowerCase().equals("thing") && !o.toLowerCase().equals("thing")
                        && !s.contains("/") && !o.contains("/")
                        && !s.contains(":") && !o.contains(":")
                        && !s.contains("-") && !o.contains("-")) {
                    conceptsName.add(s);
                    conceptsName.add(o);
                }
            }
        }
        sIter.close();
        return conceptsName;
    }

    public static Set<String> getValues(Model model, String uri) {
        Set<String> values = new HashSet<String>();
        StmtIterator sIter = model.listStatements();
        for (; sIter.hasNext();) {
            Statement stmt = sIter.nextStatement();
            String subject = stmt.getSubject().toString();
            String predicat = stmt.getPredicate().toString();
            if (subject.contains(uri) || predicat.contains(uri)) {
                String s = subject.substring(subject.indexOf("#") + 1);
                String p = predicat.substring(predicat.indexOf("#") + 1);
                if ("type".equals(p)) {
                    values.add(s);
                }
            }
        }
        sIter.close();
        return values;
    }

    public static Set<String> getValuesOfConcept(Model model, String className, String uri){
        Set<String> valuesConcept = new HashSet<String>();
        StmtIterator sIter = model.listStatements();
        for (; sIter.hasNext();) {
            Statement stmt = sIter.nextStatement();
            String subject = stmt.getSubject().toString();
            String predicat = stmt.getPredicate().toString();
            String object = stmt.getObject().toString();
            if (subject.contains(uri) || predicat.contains(uri) || object.contains(uri)) {
                String s = subject.substring(subject.indexOf("#") + 1);
                String p = predicat.substring(predicat.indexOf("#") + 1);
                String o = object.substring(object.indexOf("#") + 1);
                if (className.equals(o)) {
                    if ("type".equals(p) ) {
                        valuesConcept.add(s);
                    }
                }
            }
        }
        sIter.close();
        return valuesConcept;
    }


    public static String getRelation(Model model, String conceptSource, String conceptDestination, String uri){
        String relationName = "Fail";
        StmtIterator sIter = model.listStatements();
        while(sIter.hasNext()) {
            Statement stmt = sIter.nextStatement();
            String subject = stmt.getSubject().toString();
            String predicat = stmt.getPredicate().toString();
            String object = stmt.getObject().toString();
            if (subject.contains(uri) || predicat.contains(uri) || object.contains(uri)) {
                String s = subject.substring(subject.indexOf("#") + 1);
                String p = predicat.substring(predicat.indexOf("#") + 1);
                String o = object.substring(object.indexOf("#") + 1);

                if (o.equals(conceptSource) && s.equals(conceptDestination)) {
                    relationName = p;
                    break;
                }
            }
        }
        sIter.close();
        return relationName;
    }
}

Без создания экземпляра просто вызовите, например, JenaHelper.getConceptsNames("...","..."). Удачи.

person user3728064    schedule 03.03.2015
comment
спасибо за ваш ответ. я пробовал getConceptsName, но выводил только до уровня 2. - person Bima Wijaya; 04.03.2015
comment
В файле онтологии это структура: у нас есть много понятий, каждое понятие может иметь несколько подпонятий, последнее понятие в иерархии может иметь значения, эти значения не являются понятиями, мы называем это значениями понятия, поэтому, возможно, то, что вы называете это уровень 2 может быть значением, я хочу, чтобы вы попробовали протестировать метод JenaHelper#getValues() и проверить возвращаемый набор строк, если они представляют пропущенный уровень 2, если да, то это значения. - person user3728064; 04.03.2015