我有一个在FOAF帮助下描述人的文件。在Jena中,我试图从配置文件中解析所有年龄段,并注意到我的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次。有人可以向我解释这两种实现之间的区别是什么?
答案 0 :(得分:2)
我们假设您的数据包含多个三元组,其属性:p
引用相同的对象:o
,如下所示:
:s1 :p :o .
:s2 :p :o .
乍一看,在我看来,listObjectsOfProperty
正在向您提供您的财产所引用但没有重复的所有个人。我们可以通过深入研究依赖于GraphUtil#listObjects(...)
的实现来确认这一点。代码使用Set<Node>
来聚合所有对象。因此,您应该只使用元素:o
返回单个迭代。
另一种方法listStatements
应该在每次使用该属性时返回一个语句/三元组。在上面的示例模型中,您将/应该得到两个结果,每个结果对应一个包含:p
的语句。