Jena和listStatements和listObjectsOfProperty之间的区别

时间:2014-04-13 19:38:30

标签: jena semantic-web foaf

我有一个在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次。有人可以向我解释这两种实现之间的区别是什么?

1 个答案:

答案 0 :(得分:2)

我们假设您的数据包含多个三元组,其属性:p引用相同的对象:o,如下所示:

:s1 :p :o .
:s2 :p :o .

乍一看,在我看来,listObjectsOfProperty正在向您提供您的财产所引用但没有重复的所有个人。我们可以通过深入研究依赖于GraphUtil#listObjects(...)的实现来确认这一点。代码使用Set<Node>来聚合所有对象。因此,您应该只使用元素:o返回单个迭代。

另一种方法listStatements应该在每次使用该属性时返回一个语句/三元组。在上面的示例模型中,您将/应该得到两个结果,每个结果对应一个包含:p的语句。