Java 试图在jena api中查找RDFNode对象的父类

Java 试图在jena api中查找RDFNode对象的父类,java,class,jena,ontology,Java,Class,Jena,Ontology,我正在使用Jena java api在本体中进行搜索,并使用以下命令 Property谓词=model.getProperty(“propertyURL”); NodeInterator对象=model.listObjectsOfProperty(谓词) 要查找特定属性的所有实例, 其中model是加载本体文件的OntModel 现在,我需要找到这些实例所属的父节点/类。 由于对象是RDFNodes,我尝试了方法RDFNode.getClass(),但它只返回class com.hp.hpl.j

我正在使用Jena java api在本体中进行搜索,并使用以下命令

Property谓词=model.getProperty(“propertyURL”);
NodeInterator对象=model.listObjectsOfProperty(谓词)

要查找特定属性的所有实例, 其中
model
是加载本体文件的OntModel

现在,我需要找到这些实例所属的父节点/类。 由于对象是RDFNodes,我尝试了方法
RDFNode.getClass()
,但它只返回
class com.hp.hpl.jena.rdf.model.impl.ResourceImpl
,这不是我需要的

我需要类似于
Individual.getOntClass()
的东西。我还尝试将RDFNode对象转换为个体,然后使用此函数,但在本例中,该类似乎在转换过程中未保存,因为它返回#Thing类(最重要的一个)

有没有关于如何获得对象类的想法


提前谢谢

在没有看到数据的情况下,很难知道这是否回答了您的问题,但可能有一个简单的解释


在OWL和RDF中,一个类只是一组资源(例如,
:Cat
是所有Cat的集合,
:Tabby
是带有Tabby颜色的所有事物的集合),一个资源可以是多个集合的成员(Tabby Cat可以是这两个示例集合的成员)。这在实践中意味着一个资源可能有,并且在实践中通常有多个
rdf:type
。方法
onResource.getRDFType()
只返回一个表示类的资源,因此对于具有多个类型的资源,
getRDFType
只会选择它找到的第一个类型。作为程序员,您无法控制选择哪一个,也无法保证每次都会得到相同的索引(简要的技术说明:这取决于您当时使用的三元组存储中的索引的行为)。但是,如果您想知道资源所属的所有类,而不仅仅是其中的任意一个,请使用
OntResource.listRDFTypes()
,这将为您提供一个遍历所有类的迭代器。

在不查看数据的情况下,很难知道这是否回答了您的问题,但可能有一个简单的解释


在OWL和RDF中,一个类只是一组资源(例如,
:Cat
是所有Cat的集合,
:Tabby
是带有Tabby颜色的所有事物的集合),一个资源可以是多个集合的成员(Tabby Cat可以是这两个示例集合的成员)。这在实践中意味着一个资源可能有,并且在实践中通常有多个
rdf:type
。方法
onResource.getRDFType()
只返回一个表示类的资源,因此对于具有多个类型的资源,
getRDFType
只会选择它找到的第一个类型。作为程序员,您无法控制选择哪一个,也无法保证每次都会得到相同的索引(简要的技术说明:这取决于您当时使用的三元组存储中的索引的行为)。但是,如果您想知道资源所属的所有类,而不仅仅是其中的任意一个,请使用
ontesource.listRDFTypes()
,这将为您提供对所有类的迭代器。

我认为在您理解Jena时有一些误解需要澄清,但这样做会容易得多,为了回答您的问题,如果您编辑问题以提供您试图处理的RDF数据的样本。@Ian首先感谢您的帮助:)我的owl文件非常大,很不幸,很难提供样本。不过我编辑了这个问题,添加了一些额外的细节。我希望他们能有所帮助。如果我的问题设置得不够好,假设
model.listObjectsOfProperty()
返回RDFNodes,这是本体树的叶子,那么我想做的是获取它们所属的父类。我认为在您对Jena的理解中有一些误解需要澄清,但这样做会容易得多,为了回答您的问题,如果您编辑问题以提供您试图处理的RDF数据的样本。@Ian首先感谢您的帮助:)我的owl文件非常大,很不幸,很难提供样本。不过我编辑了这个问题,添加了一些额外的细节。我希望他们能有所帮助。如果我的问题设置得不够好,假设
model.listObjectsOfProperty()
返回RDFNodes,这些RDFNodes是本体树的叶子,那么我要做的就是获取它们所属的父类。谢谢,我没有想到一个实例所属的类可能不止一个。我正在尝试使用
OntResource.listRDFTypes()
函数,但是
model.listObjectsOfProperty(谓词)
函数的结果是RDFNodes,而不是OntResource。有一个函数
RDFNode.asResource()
,可以将其转换为资源,但我找不到将其转换为OnResource的方法。有没有一种方法可以将其转换为OnTestSource,或者有其他方法可以对RDFNode对象执行相同的操作?您可以使用
.as()
方法进行转换,例如
.as(OnTestSource.class)
.as(Individual.class)
。请参阅背景。谢谢,我没有想到一个实例所属的类可能不止一个。我正在尝试使用
OntResource.listRDFTypes()
函数,但是
model.listObjectsOfProperty(谓词)
函数的结果是RDFNodes,而不是OntResources。有一个函数
RDFNode.asResource()
,可以将其转换为资源,但我找不到将其转换为OnResource的方法。有吗