Question

I'm using Java and Jena API. I have a class Marriage which have 3 Object Properties called "hasHusband", "Haswife" and "dateOfMarriage". The first two are associated with a class Person which has the datatypeproperties like hasFirstName, hasLastName, dateOfBirth....

I'd like to access the objects properties "Haswife" and "hasHusband" and then the wife's first name and the husband's first name.

Here is how that is represented in my rdf file:

(...)

  <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>
(...)

I tried like this but it still does not works:

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

Can you please tell me what's wrong?

Thanks

EDITED

More useful details:

(...)

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

(...)

Was it helpful?

Solution

does that work ?

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

OTHER TIPS

With the information you provide it's impossible to know what's the problem exactly. It is possible that you made a mistake in one of your URIs, either in your data or in your programme. Your question is inconcistent wrt naming terms.

May I suggest a few things? First, use the datatypes xsd:date or even xsd:dateTime for dates of marriage and dates of birth. Use the YYYY-MM-DD pattern for naming entities as this sorts them chronologically if sorted lexicographically. Use consistent naming convention, e.g., hasWife and hasHusband instead of hasWife and husband. "Marriage" has two "r" in English. Use a meaningful prefix when presenting your data to people. Better, use a human friendly syntax such as 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" .

Doesn't it look nicer?

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top