Йена и разница между listStatements и listObjectsOfProperty
-
21-12-2019 - |
Вопрос
У меня есть файл, описывающий людей с помощью FOAF.В Йене я пытаюсь проанализировать все возрасты из профилей и заметил, что мои listStatements и listObjectsOfProperty дают разные результаты.Мне не удалось легко найти помощь в javadocs или другой документации.
У меня есть следующий код для запроса с помощью listStatments:
StmtIterator iter = this.foafmodel.listStatements(
(Resource) null,
this.foafmodel.createProperty("http://xmlns.com/foaf/0.1/age"),
(RDFNode) null);
А это код listObjectsOfProperty:
Property foafAge = this.foafmodel.createProperty("http://xmlns.com/foaf/0.1/age");
NodeIterator iter = this.foafmodel.listObjectsOfProperty(foafAge);
В этом случае итератор listStatements выполняет итерацию 38 раз, а listObjectsOfProperty — только 20 раз.Может ли кто-нибудь объяснить мне, в чем разница между этими двумя реализациями?
Решение
Предположим, что ваши данные содержат несколько троек с вашим свойством. :p
ссылка на один и тот же объект :o
, вот так:
:s1 :p :o .
:s2 :p :o .
На первый взгляд мне могло показаться, что listObjectsOfProperty
предоставляют вам всех лиц, на которых ссылается ваш объект, без дублирования.Мы можем подтвердить это, углубившись в реализацию, которая зависит от GraphUtil#списокОбъектов(...)
.В коде используется Set<Node>
объединить все объекты.В результате вы должны получить только одну итерацию с элементом :o
.
Другой метод, listStatements
должен возвращать вам оператор/тройку каждый раз, когда используется это свойство.В приведенном выше примере модели вы должны/должны получить два результата, по одному для каждого оператора, содержащего :p
.