2

Java と Jena API を使用しています。「 hasHusband」、「Haswife」 、「 dateOfMarriage 」という3つのオブジェクトプロパティを持つクラスMarriageがあります。最初の 2 つは、 hasFirstNamehasLastNamedateOfBirthなどのデータ型プロパティを持つクラス Personに関連付けられています。

オブジェクトのプロパティ「Haswife」と「hasHusband」にアクセスしてから、妻の名前と夫の名前にアクセスしたいと思います。

これが私のrdfファイルでどのように表されているかです:

(...)

  <j.0:FAMmariage rdf:about=http://www.fam.com/FAM#BrunoCatherine> 

  <j.0:FAMaDateMariage>25/07/2011</j.0:FAMaDateMariage>

   <j.0:FAMhasWife>
     <rdf:Description rdf:about="http://www.fam.com/FAM#Catherine20/03/1982">
       <j.0:FAMDateOfBirth>20/03/1980</j.0:FAMDateOfBirth>
       <j.0:FAMHasName>Gomez</j.0:FAMHasName>
       <j.0:FAMHasFirstName>Catherine</j.0:FAMHasFirstName>
    </rdf:Description>
  </j.0:FAMHasWife>

   <j.0:FAMHusband>
     <rdf:Description rdf:about="http://www.fam.com/FAM# Bruno15/06/1980 ">
       <j.0:FAMaDateOfBirth>15/06/1980 </j.0:FAMDateOfBirth>
       <j.0:FAMHasName>Jeandet </j.0:FAMHasName>
       <j.0:FAMHasFirstName>Bruno</j.0:FAMHasFirstName>
     </rdf:Description>
   </j.0:FAMHusband>

 </j.0:FAMmariage>
(...)

私はこのように試しましたが、まだ機能しません:

StmtIterator iter = onto.model.listStatements();  
    while (iter.hasNext()) {
        Statement stmt = iter.nextStatement();  
        Resource  subject = stmt.getSubject();     
        Property  predicate = stmt.getPredicate();   
        RDFNode   object = stmt.getObject();
        if (predicate.equals(onto.hasWife))
        {       
           System.out.print(" " + object.toString() + " ");
        }
  }

何が問題なのか教えてください。

ありがとう

編集済み

より有用な詳細:

(...)

person = model.createClass(uriBase+"person");
person.addSubClass(man);
person.addSubClass(woman);
marriage = model.createClass(uriBase+"marriage");

(...)

hasHusband = model.createObjectProperty(uriBase+"hasHusband");
hasHusband.setDomain(marriage);
hasHusband.setRange(man);

hasWife = model.createObjectProperty(uriBase+"hasWife");
hasWife.setDomain(marriage);
hasWife.setRange(woman);

hasFirstName = model.createDatatypeProperty(uriBase+"hasFirstName"); 
hasFirstName.setDomain(person);
hasFirstName.setRange(XSD.xstring);

(...)

4

2 に答える 2

3

あなたが提供する情報では、何が問題なのかを正確に知ることは不可能です。データまたはプログラムのいずれかで、URI の 1 つを間違えた可能性があります。あなたの質問は、命名用語と矛盾しています。

いくつか提案してもよろしいですか?まず、データ型xsd:dateまたはxsd:dateTime結婚日と生年月日を使用します。エンティティの名前付けには YYYY-MM-DD パターンを使用します。これは、辞書順でソートされている場合、エンティティが時系列でソートされるためです。hasWifeandhasHusbandの代わりにhasWifeandなど、一貫した命名規則を使用しhusbandます。「Marriage」は英語で「r」が2つあります。データを人々に提示するときは、意味のある接頭辞を使用してください。より良いのは、Turtle などの人間に優しい構文を使用することです。

fam:BrunoCatherine  a  fam:Marriage;
    fam:dateOfMarriage  "2011-07-25"^^xsd:date;
    fam:hasWife  fam:Catherine1982-03-20;
    fam:hasHusband  fam:Bruno1980-06-15 .
fam:Catherine1982-03-20  fam:dateOfBirth  "1982-03-20"^^xsd:date;
    fam:hasLastName  "Gomez";
    fam:hasFirstName  "Catherine" .
fam:Bruno1980-06-15  fam:dateOfBirth  "1980-06-15"^^xsd:date;
    fam:hasLastName  "Jeandet";
    fam:hasFirstName  "Bruno" .

もっと素敵に見えませんか?

于 2012-08-30T09:40:53.133 に答える
3

それは動作しますか ?

ont.hasWife=model.createProperty("your namespace URI here","FAMhasWife");

StmtIterator iter = onto.model.listStatements(null,onto.hasWife,(RDFNode)null);  
    while (iter.hasNext()) {
        Statement stmt = iter.nextStatement();  

           System.out.print(stmt.getObject().toString());
  }
于 2012-08-30T09:21:07.337 に答える