如何使用 Jena 获取个人的类别?

问题描述 投票:0回答:2

我的本体中有一个 Joy 类。它有个体 Happy、Glad 等。 Happy 的 isDefinedBy Annotation 属性表示 Joy。现在我想获取任何传递的个体的类名(或 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$1.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
2个回答
2
投票

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

如果我错了,请纠正我,但你想获得个人所属的 OntClass,对吧? 如果是 OntClass,你想检索我个人的解决方案是使用

type
命名空间的
rdf
属性。

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


0
投票

另一种可能性(我现在正在使用)是以下代码:

List<OntClass> list = new ArrayList<>();
ExtendedIterator<Resource> it = individual.listRDFTypes(true);
while (it.hasNext()) {
   Resource res = it.next();
   try {
      OntClass theClass = res.as(OntClass.class);
      list.add(theClass);
   } catch (ConversionException e) {
      // this can happen if the Resource is not a Class
   }
}

我通过查看耶拿源代码发现了这一点。请注意,一个个体可能对应于多个类别。

individual.listRDFTypes(true)
代码只会将个人视为该类的直接子级,但如果您这样做
individual.listRDFTypes(false)
,它也会考虑子类的子级。

© www.soinside.com 2019 - 2024. All rights reserved.