0

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

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

4

2 回答 2

0

Jena 是一个开源项目。非常欢迎您提交带有您希望在库中看到的附加功能的补丁。请通过Jira 帐户提交补丁。

回答您的直接问题:没有特别的理由说明属性层次结构没有等价物。但是,属性继承不像 OWL 中的类继承那样广泛使用,而且在我写 后的这些年里listHierarchyRootClasses,您是我记得第一个询问属性层次结构的人。

于 2013-11-03T22:50:15.050 回答
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);
            }
        }
    }
于 2013-11-06T13:34:55.620 回答