如何在 Apache Jena 中创建用户定义的数据类型?
How to create user defined datatypes in Apache Jena?
我正在使用 Apache Jena 创建 ontology。但是,我找不到创建自定义数据类型的方法,如下例所示:
'has value' 一些 xsd:float[>= 0.0f , <= 15.0f]。
你有什么想法吗?
看来您需要的是 DatatypeRestriction,有两个方面限制:xsd:minInclusive
和 xsd:maxInclusive
。
它是 OWL2 结构。
org.apache.jena.ontology.OntModel
不支持 OWL2,仅部分支持 OWL1.1(参见 documentation),因此,没有用于创建此类数据范围的内置方法(只有 DataOneOf
数据范围表达式,见OntModel#createDataRange(RDFList)
)。
因此您必须使用通用 org.apache.jena.rdf.model.Model
界面手动创建所需的数据类型,逐个创建。
在 RDF 中,它看起来像这样:
_:x rdf:type rdfs:Datatype.
_:x owl:onDatatype DN.
_:x owl:withRestrictions (_:x1 ... _:xn).
另见 owl2-quick-guide。
或者,要构建这样一个 ontology,您可以使用一些外部实用程序或 API。
例如,在 ONT-API (v. 2.x.x) 中,以下代码段
String ns = "";
OntModel m = OntModelFactory.createModel()
.setNsPrefixes(OntModelFactory.STANDARD).setNsPrefix("q", ns);
OntDataRange.Named floatDT = m.getDatatype(XSD.xfloat);
OntFacetRestriction min = m.createFacetRestriction(OntFacetRestriction.MinInclusive.class,
floatDT.createLiteral("0.0"));
OntFacetRestriction max = m.createFacetRestriction(OntFacetRestriction.MaxInclusive.class,
floatDT.createLiteral("15.0"));
OntDataRange.Named myDT = m.createDatatype(ns + "MyDatatype");
myDT.addEquivalentClass(m.createDataRestriction(floatDT, min, max));
m.createResource().addProperty(m.createDataProperty(ns + "someProperty"),
myDT.createLiteral("2.2"));
m.write(System.out, "ttl");
将产生以下 ontology:
@prefix q: <> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
[ q:someProperty "2.2"^^q:MyDatatype ] .
q:MyDatatype a rdfs:Datatype ;
owl:equivalentClass [ a rdfs:Datatype ;
owl:onDatatype xsd:float ;
owl:withRestrictions ( [ xsd:minInclusive "0.0"^^xsd:float ]
[ xsd:maxInclusive "15.0"^^xsd:float ]
)
] .
q:someProperty a owl:DatatypeProperty .
我正在使用 Apache Jena 创建 ontology。但是,我找不到创建自定义数据类型的方法,如下例所示: 'has value' 一些 xsd:float[>= 0.0f , <= 15.0f]。
你有什么想法吗?
看来您需要的是 DatatypeRestriction,有两个方面限制:xsd:minInclusive
和 xsd:maxInclusive
。
它是 OWL2 结构。
org.apache.jena.ontology.OntModel
不支持 OWL2,仅部分支持 OWL1.1(参见 documentation),因此,没有用于创建此类数据范围的内置方法(只有 DataOneOf
数据范围表达式,见OntModel#createDataRange(RDFList)
)。
因此您必须使用通用 org.apache.jena.rdf.model.Model
界面手动创建所需的数据类型,逐个创建。
在 RDF 中,它看起来像这样:
_:x rdf:type rdfs:Datatype.
_:x owl:onDatatype DN.
_:x owl:withRestrictions (_:x1 ... _:xn).
另见 owl2-quick-guide。
或者,要构建这样一个 ontology,您可以使用一些外部实用程序或 API。 例如,在 ONT-API (v. 2.x.x) 中,以下代码段
String ns = "";
OntModel m = OntModelFactory.createModel()
.setNsPrefixes(OntModelFactory.STANDARD).setNsPrefix("q", ns);
OntDataRange.Named floatDT = m.getDatatype(XSD.xfloat);
OntFacetRestriction min = m.createFacetRestriction(OntFacetRestriction.MinInclusive.class,
floatDT.createLiteral("0.0"));
OntFacetRestriction max = m.createFacetRestriction(OntFacetRestriction.MaxInclusive.class,
floatDT.createLiteral("15.0"));
OntDataRange.Named myDT = m.createDatatype(ns + "MyDatatype");
myDT.addEquivalentClass(m.createDataRestriction(floatDT, min, max));
m.createResource().addProperty(m.createDataProperty(ns + "someProperty"),
myDT.createLiteral("2.2"));
m.write(System.out, "ttl");
将产生以下 ontology:
@prefix q: <> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
[ q:someProperty "2.2"^^q:MyDatatype ] .
q:MyDatatype a rdfs:Datatype ;
owl:equivalentClass [ a rdfs:Datatype ;
owl:onDatatype xsd:float ;
owl:withRestrictions ( [ xsd:minInclusive "0.0"^^xsd:float ]
[ xsd:maxInclusive "15.0"^^xsd:float ]
)
] .
q:someProperty a owl:DatatypeProperty .