最简单的示例代码如下。
OntModel individuals = ModelFactory.createOntologyModel();
TreeMap<String, String> namespaces=new TreeMap<String,String>();
namespaces.put("pubo", "http://www.example.org.cn/standards/publishing/ontology/cores/");
individuals.setNsPrefixes(namespaces);
OntClass class1=individuals.createClass(namespaces.get("pubo")+"class1");
class1.setLabel("class1", "en");
OntClass class2=individuals.createClass(namespaces.get("pubo")+"class2");
class2.setLabel("class2", "en");
class2.setSuperClass(class1);
System.out.println(class2.getSuperClass().getURI());
DatatypeProperty p = individuals.createDatatypeProperty(namespaces
.get("pubo") + "haha");
p.addDomain(class2);
System.out.println(class2.getSuperClass().getURI());
第一个输出是:http://www.example.org.cn/standards/publishing/ontology/cores/class1 . 在我 p.addDomain(class2) 之后,第二个输出是:http://www.w3.org/2000/01/rdf-schema#Resource . 为什么????有什么建议吗?
最佳答案
getSuperClass
OntClass getSuperClass()
Answer a class that is the super-class of this class. If there is more than one such class, an arbitrary selection is made. If there is no such super-class, return null.
我同意这种行为有点令人惊讶,但这不是不正确。文件说: class1 和 rdfs:Resource 都是您的 class2 的父类(super class),因此两者都可以由 getSuperClass 合法地返回,因为它保证是“ super -类(class)”。由于 Jena 可能在内部做的是请求所有 class2 rdfs:subClassOf X 形式的三元组并取 X 的第一个值,获得不同结果所需要做的就是发生改变可以返回的 X 值或返回它们的顺序的事情。一般来说,这些东西没有指定,所以这里没有任何不正确的地方。
如果你想检查某个东西是否是另一个的父类(super class),你可以遍历 listSuperClasses 产生的所有值, 或者简单地检查 hasSuperClass .这两种方法都有一个接受 boolean 参数的变体,因此请务必查看文档。
关于java - 为什么 addDomain 方法会影响域的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25737302/