Jena と listStatements と listObjectsOfProperty の違い
-
21-12-2019 - |
質問
FOAF の助けを借りて人々を記述したファイルがあります。Jena でプロファイルからすべての年齢を解析しようとしているのですが、listStatements と listObjectsOfProperty では異なる結果が得られることに気付きました。Javadoc やその他のドキュメントからヘルプを簡単に見つけることができませんでした。
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 回のみ反復します。誰かがこれら 2 つの実装の違いを説明してもらえますか?
解決
データにプロパティを含む複数のトリプルが含まれていると仮定します。 :p
同じオブジェクトを参照する :o
, 、 そのようです:
:s1 :p :o .
:s2 :p :o .
一見すると、私には次のように見えるでしょう。 listObjectsOfProperty
あなたのプロパティによって参照されるすべての個人を重複なく提供します。これは、に依存する実装を詳しく調べることで確認できます。 GraphUtil#listObjects(...)
. 。コードでは、 Set<Node>
すべてのオブジェクトを集約します。結果として、要素を使用した単一の反復のみが返されるはずです。 :o
.
もう一つの方法は、 listStatements
そのプロパティが使用されるたびにステートメント/トリプルを返す必要があります。上記のモデル例では、以下を含むステートメントごとに 1 つずつ、合計 2 つの結果が得られます/得られるはずです。 :p
.