2012-08-30 274 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