2012-08-30 216 views
2

我正在使用Java和Jena API。 我有一個類婚姻其中有3個名爲 「hasHusband」, 「Haswife」 和 「dateOfMarriage」 對象屬性。前兩個是與類Person相關其中有像hasFirstNamehasLastName出生日期 ....我無法訪問對象屬性

我想訪問對象的屬性「Haswife」和datatypeproperties 「有丈夫」,然後是妻子的名字和丈夫的名字。

這裏是怎麼說也是我的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() + " "); 
     } 
    } 

你能告訴我有什麼問題嗎?

感謝

EDITED

更多有用的細節:

(...)

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); 

(...)

+0

你是怎麼定義到.hasWife的? – Pierre

+0

這個RDF/XML代碼傷害了我的眼睛!而且,第一行有語法錯誤,缺少引號。 –

回答

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()); 
    } 
+0

就是這樣!非常感謝你! – user1632278

3

根據您提供的信息,不可能完全知道問題所在。您可能在您的某個URI中出錯,無論是在您的數據還是在您的程序中。您的問題與命名條款不一致。

我可以提出幾件事嗎?首先,使用數據類型xsd:date或甚至xsd:dateTime來獲得結婚日期和出生日期。使用YYYY-MM-DD模式命名實體,因爲如果按照字典順序進行排序,它們會按時間順序排序。使用一致的命名慣例,例如hasWifehasHusband而不是hasWifehusband。 「婚姻」有兩個英文「r」。將數據呈現給人時使用有意義的前綴。更好的是,使用人類友好的語法,如烏龜。

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" . 

它看起來不漂亮嗎?

+0

非常感謝您的有益建議! – user1632278