0

Jena の OntModel にはメソッドlistHierarchyRootClassesがあり、クラス階層の最上位ノードを表す、このオントロジー モデル内のクラスの反復子を返します。しかし、なぜ OntModel にはセマンティック プロパティに対して同じ関数のメソッドがないのでしょうか? プロパティ階層もあるのに、なぜ開発者はlistHierarchyRootProperties?

メソッドを使用してこれを解決しましlistAllOntPropertiesたが、回避策であり、見栄えがよくありません。なぜ必要なのかわかりません。理由は何ですか?

4

2 に答える 2

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 に答える