2013-03-13 8 views
6

モデルに特定のリソースがあるかどうかを調べようとしています。そのために私は以下を使用しています:Jena - 特定のリソースがモデルに含まれているかどうかを確認する方法

model.getResource("example") 

このメソッドはdocをチェックすると、このメソッドはcreateResourceとまったく同じように動作します。それで、たとえそれがモデルにないとしても、私は新しいリソースを得るでしょう。

リソースが作成されていない場合、そのリソースを作成しないようにするにはどうすればよいですか?

ありがとうございます!

+0

多分このリンク[インターフェイスモデル](http://jena.apache.org/documentation/javadoc/jena/com/hp/hpl/jena/rdf/model/Model.html)は便利です。 –

+1

ちょっと調べたら、次の方法を見つけました。私はこれが本当にそれを達成するための最良の方法であるかどうかわかりませんが、動作します: リソースtoSearch = ResourceFactory.createResource( "example"); if(!model.containsResource(toSearch))...; – jevora

+1

解決済みの場合は、回答を投稿して受け入れますので、同じ問題の次の人に回答が見つかると、バッジも取得します! :) – Boaz

答えて

11

Resourceオブジェクト自体によってモデルでではありません。このモデルは、サブジェクト、述語およびオブジェクト(通常はSPOと略記)を含むトリプル-Statementのオブジェクトのみを含んでいます。 S、P、またはOのいずれか1つをリソースとすることができます(Propertyは、JenaおよびRDF標準ではResourceのサブタイプであることに注意してください)。

  • は、モデルMが対象とリソースRを含んでいます:?だから、どちらかに「このモデルは、このリソースが含まれていない」からご質問を絞り込む必要がありますか

  • モデルMはリソースRをサブジェクト、述語またはオブジェクトとして含んでいますか?

これはのように達成することができます。ちなみに

Resource r = ... ; 
Model m = ... ; 

// does m contain r as a subject? 
if (m.contains(r, null, (RDFNode) null)) { 
    .. 
} 

// does m contain r as s, p or o? 
if (m.containsResource(r)) { 
    .. 
} 

、あなたのコードサンプルでは、​​あなたが

model.getResource("example") 

を持っているこれは、指定されたURIに対応するResourceオブジェクトを返しますが、左右されませんモデル内のトリプルに影響を与えます。これはModelgetResourcecreateResourceの両方を持つ理由です。getはリソースオブジェクトを再利用するため、潜在的に若干効率的ですが、セマンティクスは基本的に同じです。ただし、getResourceまたはcreateResourceに渡す引数は、である必要があります。完全なURIの代わりに"example"のようなトークンを使用し始めると、将来の問題を抱えているので、快適になる前にこの悪い習慣を止めることをお勧めします!

+0

ありがとうございました。それは間違いなく解決策です。悪い習慣について、心配しないでください、私の開発では私は実際のURIを使用しています。今回は問題ではなかったので、 "example"を使用しました。 – jevora

+0

解決策をチェックする:r、null、nullに適合するいくつかの包含があります。私はむしろ提案します: model.contains(リソース、null、(RDFNode)null) – jevora

+0

良いキャッチ。はい、 'contains()'のメソッドシグネチャが 'object'引数でキャストを必要とするほど自由度がありますが、これはJenaの初期の歴史の中でずっと以前に作られたデザインの決定であり、あまりにも破壊的なものになります今変更する。 –

2

少し研究した後、私は次の方法を見つけました。私は、これは実際にそれを達成するための最良の方法であれば知っているが、機能しません。

イエナで
Resource toSearch = ResourceFactory.createResource("example"); 
if(!model.containsResource(toSearch))...; 
+0

これは正解ですが、私はそれを正しくマークするために2日間待たなければなりません – jevora

関連する問題