Jena 的 OntModel 有一个方法listHierarchyRootClasses,它返回一个迭代器,该迭代器在这个本体模型中代表类层次结构的最上层节点的类。但是为什么 OntModel 对于语义属性没有相同功能的方法呢?还有一个属性层次结构,那么为什么开发人员制作一个listHierarchyRootProperties
?
我已经通过使用listAllOntProperties
方法解决了这个问题,但这是一种解决方法,看起来不太好。我不明白为什么有必要。是什么原因?
Jena 的 OntModel 有一个方法listHierarchyRootClasses,它返回一个迭代器,该迭代器在这个本体模型中代表类层次结构的最上层节点的类。但是为什么 OntModel 对于语义属性没有相同功能的方法呢?还有一个属性层次结构,那么为什么开发人员制作一个listHierarchyRootProperties
?
我已经通过使用listAllOntProperties
方法解决了这个问题,但这是一种解决方法,看起来不太好。我不明白为什么有必要。是什么原因?
Jena 是一个开源项目。非常欢迎您提交带有您希望在库中看到的附加功能的补丁。请通过Jira 帐户提交补丁。
回答您的直接问题:没有特别的理由说明属性层次结构没有等价物。但是,属性继承不像 OWL 中的类继承那样广泛使用,而且在我写 后的这些年里listHierarchyRootClasses
,您是我记得第一个询问属性层次结构的人。
这是我的解决方法,它产生按字母排序的语义属性层次结构(树)。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);
}
}
}