OntModel接口没有listHierarchyRootProperties方法

时间:2013-11-03 16:46:43

标签: jena

Jena的OntModel有一个方法listHierarchyRootClasses,它在这个本体模型中的类上返回一个迭代器,它代表类层次结构的最高节点。但是为什么OntModel对于语义属性没有相同函数的方法呢?还有一个属性层次结构,那么为什么开发人员会创建一个listHierarchyRootProperties

我已经使用listAllOntProperties方法解决了这个问题,但它是一种解决方法,看起来不太好。我不明白为什么有必要。是什么原因?

2 个答案:

答案 0 :(得分:0)

Jena是一个开源项目。我们非常欢迎您提交一个补丁,其中包含您希望在库中看到的其他功能。请通过the Jira account提交补丁。

回答你的直接问题:没有特别的理由说明为什么没有相应的属性层次结构。但是,属性继承并没有像OWL中的类继承那样广泛使用,而且自从我写listHierarchyRootClasses以来的所有年份,你都是我记得第一个询问属性层次结构的人。

答案 1 :(得分:0)

这是我的解决方法,它生成按字母顺序排序的语义属性层次结构(树)。 getPropertyTreeModel()方法返回ice:tree组件的模型,参数domContent不重要(这是我的特殊需求):

 protected static DefaultTreeModel getPropertyTreeModel(OntModel ontModel, Document domContent) {
        System.out.println("Creating property model...");
        DefaultMutableTreeNode rootTreeNode = getRoot();
        DefaultTreeModel treeModel = new DefaultTreeModel(rootTreeNode);
        Iterator i = getAlphabeticalIterator(ontModel.listAllOntProperties().filterDrop(new Filter() {
            @Override
            public boolean accept(Object o) {
                return !((OntProperty) o).listSuperProperties(true).toList().isEmpty();
            }
        }));
        while (i.hasNext()) {
            joinResource(rootTreeNode, (OntProperty) i.next(), new ArrayList(), OntProperty.class, domContent);
        }
        return treeModel;
    }


private static Iterator getAlphabeticalIterator(ExtendedIterator ei) {
        List l = ei.toList();
        Collections.sort(l, new Comparator<OntResource>() {
            @Override
            public int compare(OntResource o1, OntResource o2) {
                return (o1.getLocalName().compareTo(o2.getLocalName()));
            }
        });
        return l.iterator();
    }


 private static DefaultMutableTreeNode getRoot() {
        DefaultMutableTreeNode rootTreeNode = new DefaultMutableTreeNode();
        ClassNodeUserObject rootObject = new ClassNodeUserObject(rootTreeNode);
        rootObject.setExpanded(true);
        rootTreeNode.setUserObject(rootObject);
        return rootTreeNode;
    }

 private static void joinResource(DefaultMutableTreeNode parent, OntResource res, List occurs, Class c, Document domContent) {
        DefaultMutableTreeNode branchNode = new DefaultMutableTreeNode();
        SemanticNodeUserObject branchObject = (c.equals(OntClass.class))
                ? new ClassNodeUserObject(branchNode) : new PropertyNodeUserObject(branchNode);
        branchObject.setOntResource(res);
        branchObject.setExpanded(false);
        branchObject.setLeaf(true);
        // optimalizace: v pripade prazdneho souboru bez parsovani, aktualizace barev
        if (domContent != null) {
            setColorToNode(branchObject, domContent);
        }
        branchNode.setUserObject(branchObject);
        parent.add(branchNode);

        // rekurze
        if (res.canAs(c) && !occurs.contains(res)) {
            ExtendedIterator ei = (c.equals(OntClass.class)) ? ((OntClass) res).listSubClasses(true)
                    : ((OntProperty) res).listSubProperties(true);
            branchObject.setLeaf(!ei.hasNext());
            for (Iterator i = getAlphabeticalIterator(ei); i.hasNext();) {
                OntResource sub = (OntResource) i.next();
                occurs.add(res);
                joinResource(branchNode, sub, occurs, c, domContent);
                occurs.remove(res);
            }
        }
    }