Jena e a diferença entre listStatements e listObjectsOfProperty
-
21-12-2019 - |
Pergunta
Tenho um arquivo descrevendo pessoas com a ajuda do FOAF.Em Jena, estou tentando analisar todas as idades dos perfis e percebi que meus listStatements e listObjectsOfProperty me dão resultados diferentes.Não consegui encontrar facilmente nenhuma ajuda nos javadocs ou em outra documentação.
Tenho o seguinte código para consultar com listStatments:
StmtIterator iter = this.foafmodel.listStatements(
(Resource) null,
this.foafmodel.createProperty("http://xmlns.com/foaf/0.1/age"),
(RDFNode) null);
E este é o código para listObjectsOfProperty:
Property foafAge = this.foafmodel.createProperty("http://xmlns.com/foaf/0.1/age");
NodeIterator iter = this.foafmodel.listObjectsOfProperty(foafAge);
Nesse caso, o iterador listStatements itera 38 vezes, enquanto o listObjectsOfProperty apenas 20 vezes.Alguém pode me explicar qual é a diferença entre essas duas implementações?
Solução
Suponhamos que seus dados contenham vários triplos com sua propriedade :p
referenciando o mesmo objeto :o
, igual a:
:s1 :p :o .
:s2 :p :o .
À primeira vista, parece-me que listObjectsOfProperty
estamos fornecendo a você todos os indivíduos referenciados por sua propriedade sem duplicação.Podemos confirmar isso investigando a implementação que depende de GraphUtil#listaObjetos(...)
.O código usa um Set<Node>
para agregar todos os objetos.Como resultado, você deve retornar apenas uma única iteração com o elemento :o
.
O outro método, listStatements
deve retornar para você uma declaração/triplo para cada vez que essa propriedade for usada.No modelo de exemplo acima, você obteria/deveria obter dois resultados, um para cada instrução contendo :p
.