1

次のオントロジーを考えてみましょう。ここPERSONNAME、、、SURNAMEおよびIDENTIFICATIONクラスはクラスです。NAMESURNAMEのサブクラスですIDENTIFICATIONhasSurname機能的hasNameObjectPropertyです。ドメインと範囲文字列hasValueを持つ DataTypePropertyです。IDENTIFICATION

ここに画像の説明を入力

jena を使用して、2 人の人物 (person1 は「Henry Ford」、person2 は「Harrison Ford」) を使用して、このモデルの自動インスタンス化を行います。

この繰り返しに対処するために、次のスキーマに従ってオントロジーを自動的にインスタンス化する必要があります。ここで、個人name1は person1 と person2 の両方に使用されます。

String   NS    = .... // the name space
OntModel model = .... // Jena model to use   

// creating all the individuals with random uri

Individual person1  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name1    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname1 = model.createIndividual(NS + "SURNAME" + Math.random());
Individual person2  = model.createIndividual(NS + "PERSON" + Math.random());
Individual name2    = model.createIndividual(NS + "NAME" + Math.random());
Individual surname2 = model.createIndividual(NS + "SURNAME" + Math.random());

// asserting that ...
// person1 _hasName_ (name1 _hasValue_ "Ford")     
// person1 _hasSurname (surname1 _hasValue_ "Henry")

name1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Ford"));
surname1.addProperty(model.getOntProperty(NS + "hasValue"), Resourcefactory.createLiteral("Henry"));
model.add(person1, model.getOntProperty(NS + "hasName"), name1);
model.add(person1, model.getOntProperty(NS + "hasSurname"), surname1);


name1 = null; // loosing reference to name1

// asserting that ...
// person2 _hasName_ name1
// person2 _hasSurname (surname2 _hasValue_ "Harrison")

インスタンス化を正しく完了するために、NAMEプロパティが「フォード」であるクラスの個体を見つける方法は?hasvalue

返信ありがとうございます。

4

1 に答える 1

3

概念的に、なぜ異なる個人である必要があるのでしょうかsurname1? surname2の使用はMath.random()非常に奇妙に見えます。あなたが述べた問題について考えてみると、Henry Ford と Harrison Ford という 2 人の個人がいて、ドメイン モデルでは名前と姓を別々の個人にする必要があります (これには正当な理由があると思いますが、これは奇妙な方法です)。この特定の問題にアプローチします)。ですから、あなたのモデル化のアプローチについて私が持っている質問は次のとおりです。両方の人に共有されている 1 つの姓 Ford がありますか、それともたまたま同じhasValueリテラルを持つ 2 つの姓がありますか?

個人的には、グラフの共通構造を利用してこれにアプローチします。

ns:ford 
  a ns:Surname ;
  ns:hasValue "Ford".

ns:harrison
  a ns:FirstName ;
  ns:hasValue "Harrison".

ns:henry
  a ns:FirstName ;
  ns:hasValue "Henry".

ns:person1
  a ns:Person ;
  ns:firstName ns:henry ;
  ns:surname ns:ford .

ns:person2
  a ns:Person ;
  ns:firstName ns:harrison ;
  ns:surname ns:ford .

しかし、あなたが解決しようとしている問題がわからないので、これがあなたにとって正しいアプローチであるかどうかはわかりません。たとえば、同じ姓を持つすべての人を簡単に見つけることができます。

一般的に言えば、グラフ内のノードを共有したくないため、Ford の 2 つの異なる用途を区別したい場合は、空のノードを使用して、乱数をいじる手間を省くことができます。

ns:person1
  a ns:Person ;
  [a ns:SurName ; ns:hasValue "Ford"] ;
  [a ns:FirstName ; ns:hasValue "Henry"].

したがって、あなたの質問に対する私の主な答えは、作成しようとしているグラフについて明確にすることです。そうすれば、Jena が何を呼び出す必要があるかがより明確になります。

特定の質問に答えるために、プロパティのパターンに基づいて特定のリソースを見つけたい場合は、SPARQL クエリを使用することをお勧めします。Jena API 呼び出しのパターンを使用してそれを行うことができますが、パターンの初期サイズが小さいと、SPARQL クエリははるかにコンパクトになります。

于 2012-10-31T13:10:53.290 に答える