如何使用 Jena 获取个人的 class?

How to get the class of an individual using Jena?

我 ontology 有 class 快乐。它有个人 Happy、Glad 等。Happy 的 isDefinedBy Annotation 属性 表示 Joy。现在我想为任何通过的个人获取 class 名称(或 URI),因此我为个人尝试了 getOntClass() 方法,但没有得到所需的结果。然后我尝试了 getIsDefinedBy() 方法并得到了这个。

Exception in thread "main" com.hp.hpl.jena.ontology.ConversionException: Cannot convert node "Joy" to OntResource
at com.hp.hpl.jena.ontology.impl.OntResourceImpl.wrap(OntResourceImpl.java:79)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:152)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:31)
at com.hp.hpl.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:62)
at com.hp.hpl.jena.enhanced.EnhNode.as(EnhNode.java:107)
at com.hp.hpl.jena.ontology.impl.OntResourceImpl.objectAs(OntResourceImpl.java:1411)
at com.hp.hpl.jena.ontology.impl.OntResourceImpl.objectAsResource(OntResourceImpl.java:1421)
at com.hp.hpl.jena.ontology.impl.OntResourceImpl.getIsDefinedBy(OntResourceImpl.java:395)
at myPackage.Ontology.load(Ontology.java:90)
at myPackage.MyClass.main(MyClass.java:75)

这是我使用的代码

Individual indiv = mod.getIndividual(namespace + "Happy");
//System.out.println(indiv.getOntClass());
System.out.println(indiv.getIsDefinedBy());

我该怎么办?

据我对 Jena 的了解(我已经使用它 3 个月了),您误解了 URI 的含义。 URI 代表唯一资源标识符或类似的东西,因此同一 OntClass 的 2 个个体将具有不同的 URI 但相同的 OntClass。

如果我错了请纠正我,但您想获得个人所属的这个 OntClass,对吗? 如果它是你想要检索的 OntClass,我个人的解决方案是使用 rdf 命名空间的 属性 type

OntModel m = ModelFactory.createOntModel();
m.read("file:///" + ontologyPath);
string RDF = m.getNsPrefixURI("rdf");
string namespace = m.getNSPrefixURI(yourOntologyPrefix);
Property type = m.getProperty(RDF, "type");
Individiual indiv = m.getIndividual(namespace + "Happy");
if (indiv.getPropertyResourceValue(type).toString().Equals(namespace + "Joy"))
    println("you got it");
else
    println("this is not joy :(");

可能不是最优雅的方式,但很好 :D