2

我正在使用 Java 和 Jena API。我有一个婚姻类,它有 3 个对象属性,称为“ hasHusband ”、“ Haswife ”和“ dateOfMarriage ”。前两个与具有数据类型属性的类 Person相关联,例如hasFirstNamehasLastNamedateOfBirth ...。

我想访问对象属性“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

那样有用吗 ?

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 回答
3

根据您提供的信息,不可能确切地知道问题出在哪里。您可能在其中一个 URI 中犯了错误,无论是在您的数据中还是在您的程序中。您的问题是命名术语不一致。

我可以建议一些事情吗?首先,使用数据类型xsd:date,甚至xsd:dateTime用于结婚日期和出生日期。使用 YYYY-MM-DD 模式来命名实体,因为如果按字典顺序排序,则会按时间顺序对它们进行排序。使用一致的命名约定,例如,hasWifeandhasHusband而不是hasWifeand husband。“Marriage”在英文中有两个“r”。在向人们展示您的数据时使用有意义的前缀。更好的是,使用对人类友好的语法,例如 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 回答