Jena的OntModel有一个方法listHierarchyRootClasses,它在这个本体模型中的类上返回一个迭代器,它代表类层次结构的最高节点。但是为什么OntModel对于语义属性没有相同函数的方法呢?还有一个属性层次结构,那么为什么开发人员会创建一个listHierarchyRootProperties
?
我已经使用listAllOntProperties
方法解决了这个问题,但它是一种解决方法,看起来不太好。我不明白为什么有必要。是什么原因?
答案 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);
}
}
}