我想使用 Jena 创建一个本体。
在我的 OntModel 中,我定义了一个 Person 类,它等效于 foaf:Person,因为我的 Person 类可以具有 foaf:Person 的属性以及我自己定义的属性 (hasHairColor)。
String NS = "http://example.com/ontology#";
model = ModelFactory.createOntologyModel();
OntClass person = model.createClass(NS + "Person");
person.setEquivalentClass(FOAF.Person);
//adding a property that I define myself
DatatypeProperty hairColor = model.createDatatypeProperty(ns + "hasHairColor");
model.getOntClass(ns+"Person").addProperty(hairColor, model.createOntResource(XSD.xstring));
hairColor.setDomain(model.getOntClass(ns+"Person"));
hairColor.setRange(model.getOntResource(XSD.xstring));
我想将 foaf:Person 的生日属性添加到我的班级 Person 中,我尝试了两种方法,但它们似乎不是正确的方法:
- 创建一个新的数据类型属性:
String property = "http://xmlns.com/foaf/0.1/birthday";
String typeProperty = "http://www.w3.org/2000/01/rdf-schema#Literal";
DatatypeProperty extenalProperty = model.createDatatypeProperty(property);
model.getOntClass(ns+"Person").addProperty(extenalProperty, model.getOntResource(typeProperty));
extenalProperty.setDomain(model.getOntClass(ns+"Person"));
extenalProperty.setRange(model.getOntResource(typeProperty));
通过这种方式,它在我的本体输出文件(海龟格式)中正确地写出属性,但它也重写了 foaf:birthday 属性:
foaf:birthday a owl:DatatypeProperty ;
rdfs:domain Lto:Person ;
rdfs:range rdfs:Literal .
myOnt:Person a owl:Class ;
myOnt:hasHairColor xsd:string ;
owl:equivalentClass foaf:Person ;
foaf:birthday rdfs:Literal .
- 获取我的 OntModel 的属性资源:
String property = "http://xmlns.com/foaf/0.1/birthday";
String typeProperty = "http://www.w3.org/2000/01/rdf-schema#Literal";
model.getOntClass(ns+"Person").addProperty((DatatypeProperty)model.createOntResource(property), model.getOntResource(typeProperty));
这样,它会引发 NullPointerException 错误,因此它也不起作用。
谁能告诉我在这种情况下哪种方法是正确的?非常感谢您的帮助!