Попытка найти родительский класс объектов RDFNode в jena api

Я использую Jena java api для поиска в онтологии и использую команду

Property predicate=model.getProperty("propertyURL"); NodeIterator objects = model.listObjectsOfProperty(predicate);

чтобы найти все экземпляры определенного свойства, где model - это модель OntModel, в которую загружается файл онтологии.

Теперь мне нужно найти родительский узел / класс, к которому принадлежат эти экземпляры. Поскольку объекты являются RDFNodes, я попробовал метод RDFNode.getClass(), но он просто возвращает class com.hp.hpl.jena.rdf.model.impl.ResourceImpl, что мне не нужно.

Мне нужно что-то подобное с Individual.getOntClass(). Я также попытался преобразовать объекты RDFNode в Individuals, а затем использовать эту функцию, но в этом случае кажется, что класс не сохраняется во время этого преобразования, потому что он возвращает класс #Thing (который является первым из всех).

Есть идеи, как я могу получить класс объектов?

Заранее спасибо!


person missrg    schedule 10.01.2013    source источник
comment
Я думаю, что есть некоторые заблуждения, которые нужно прояснить в вашем понимании Йены, но было бы намного проще сделать это и ответить на ваш вопрос, если вы отредактируете вопрос, чтобы предоставить образец данных RDF, которые вы пытаетесь обработать. .   -  person Ian Dickinson    schedule 11.01.2013
comment
@Ian прежде всего спасибо за ваш интерес к помощи :) Мой файл совы действительно большой, поэтому, к сожалению, сложно предоставить образец. Я отредактировал вопрос, добавив некоторые дополнительные детали. Надеюсь, они вам пригодятся. В случае, если мой вопрос задан недостаточно хорошо, при условии, что model.listObjectsOfProperty() возвращает RDFNodes, которые являются листьями дерева онтологии, я пытаюсь получить родительские классы, к которым они принадлежат.   -  person missrg    schedule 11.01.2013


Ответы (1)


Немного сложно понять, отвечает ли это на ваш вопрос, не просматривая данные, но этому может быть простое объяснение.

В OWL и RDF класс - это просто набор ресурсов (например, :Cat - это набор всех кошек, :Tabby - набор всех вещей, окрашенных в полосатый цвет), а ресурс может быть членом многих наборов (полосатый кот будет быть членом обоих этих наборов примеров). На практике это означает, что ресурс может иметь, а на практике обычно имеет более одного rdf:type. Метод OntResource.getRDFType() возвращает только один ресурс, обозначающий класс, поэтому в случае ресурса с несколькими типами getRDFType просто выберет первый найденный. Как программист, вы не можете контролировать, какой из них будет выбран, и нет никакой гарантии, что вы будете получать каждый раз одно и то же (краткое техническое объяснение: это зависит от поведения индексов в любом тройном хранилище, которое вы используете в время). Однако, если вы хотите знать все классы, которым принадлежит ресурс, а не только какой-то произвольный из них, используйте OntResource.listRDFTypes(), который предоставит вам итератор для всех из них.

person Ian Dickinson    schedule 11.01.2013
comment
Спасибо, я не думал, что экземпляр может принадлежать более чем одному классу. - person missrg; 11.01.2013
comment
Я пытаюсь использовать OntResource.listRDFTypes() функцию, но результатом model.listObjectsOfProperty(predicate) функций являются RDFNodes, а не OntResources. Есть функция RDFNode.asResource(), чтобы преобразовать его в ресурс, но я не смог найти способ преобразовать его в OntResource. Есть ли способ преобразовать его в OntResource или есть другой способ сделать то же самое с объектами RDFNode? - person missrg; 11.01.2013
comment
Вы можете конвертировать с помощью метода .as(), например. .as( OntResource.class ) или .as( Individual.class ). См. jena.apache.org/documentation/ontology / для фона. - person Ian Dickinson; 11.01.2013