0

我想使用 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 中,我尝试了两种方法,但它们似乎不是正确的方法:

  1. 创建一个新的数据类型属性:
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 .
  1. 获取我的 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 错误,因此它也不起作用。

谁能告诉我在这种情况下哪种方法是正确的?非常感谢您的帮助!

4

0 回答 0