我正在使用Java和Jena API。 我有一个 类婚姻 ,它有3个对象属性,名为“ hasHusband ”,“ Haswife ”和“ dateOfMarriage ”。前两个与 类Person 相关联,其具有数据类型属性,如 hasFirstName , hasLastName , dateOfBirth ....
我想访问对象属性“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() + " ");
}
}
你能告诉我出了什么问题吗?
由于
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 :(得分: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());
}
答案 1 :(得分:3)
根据您提供的信息,无法确切地知道问题是什么。您可能在您的某个URI中犯了错误,无论是在您的数据中还是在您的程序中。您的问题与命名条款不一致。
我可以建议一些事情吗?首先,使用数据类型xsd:date
或甚至xsd:dateTime
来确定结婚日期和出生日期。使用YYYY-MM-DD模式命名实体,因为如果按字典顺序排序,它会按时间顺序对它们进行排序。使用一致的命名约定,例如hasWife
和hasHusband
,而不是hasWife
和husband
。 “婚姻”有两个英文“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" .
看起来不是很好吗?