如何在 Jena 中添加合格的基数限制?我不能使用 createCardinalityQRestriction
因为 OntModelSpec
是针对 OWL 的第一个版本,而不是 OWL2。在ModelFactory的createOntologyModel中,有没有办法创建一个OWL2本体?我需要一个类表达式
我试过使用这个代码:
OntModel ontModel = ModelFactory.createOntologyModel();
OntClass ret = ontModel.createCardinalityQRestriction(null, ontProperty, cardinality, ontClass2 );
ontClass.addSuperClass(ret);
但我得到这个异常(exception):
最佳答案
我实际上只是在处理另一个问题 Adding more complicated subclass axiom 时遇到了这个问题。在 Jena 中创建这个有点棘手,因为对限定基数限制的支持是 OWL2 的一个特性,而 Jena 对 OWL2 的支持有限:
此外,Javadoc for the OWL2 vocabulary class 说:
您可能还会看到我在 Jena 邮件列表上发布的关于类似问题 Re: Owl maxCardinality restriction 的回复。
但无论如何你想创造一个?那么您就是“正在使用当前的 OWL1 支持进行 OWL2 工作并需要一组合适的名称的用户”之一。要找出 OWL2 构造应该如何在 RDF 中序列化,我们需要查看 OWL 2 Web Ontology Language Mapping to RDF Graphs (Second Edition) ,特别是 2 Mapping from the Structural Specification to RDF Graphs 部分,它告诉我们类表达式
ObjectExactCardinality( n OPE CE )
被序列化为以下三元组
_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:qualifiedCardinality "n"^^xsd:nonNegativeInteger .
_:x owl:onClass T(CE) .
其中
_:x
是作为类的资源。 Jena 已经处理的不合格案件,转ObjectExactCardinality( n OPE )
进入
_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:cardinality "n"^^xsd:nonNegativeInteger .
如果我们有后者之一,我们可以用
owl:cardinality
属性替换它的 owl:qualifiedCardinality
属性,并添加适当的 owl:onClass
属性。下面是一些执行此操作的 Java 代码:import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntProperty;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.OWL2;
public class QualifiedRestrictionExample {
public static OntClass createCardinalityQRestriction(
OntModel model,
String uri,
Property prop,
int cardinality,
OntClass clas ) {
OntClass klass = model.createCardinalityRestriction( uri, prop, cardinality );
klass.removeAll( OWL.cardinality );
klass.addLiteral( OWL2.qualifiedCardinality, cardinality );
klass.addProperty( OWL2.onClass, clas );
return klass;
}
public static void main(String[] args) {
String NS = "https://stackoverflow.com/q/20562107/1281433/";
OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM );
OntClass test = model.createClass( NS+"Test" );
OntProperty j = model.createObjectProperty( NS+"JeVysledkom" );
OntClass k = model.createClass( NS+"Kolik_Fazovy" );
OntClass x = createCardinalityQRestriction(model, null, j, 1, k);
test.addSuperClass( x );
model.write( System.out, "RDF/XML-ABBREV" );
}
}
输出:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Class rdf:about="https://stackoverflow.com/q/20562107/1281433/Kolik_Fazovy"/>
<owl:Class rdf:about="https://stackoverflow.com/q/20562107/1281433/Test">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onClass rdf:resource="https://stackoverflow.com/q/20562107/1281433/Kolik_Fazovy"/>
<owl:qualifiedCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#long"
>1</owl:qualifiedCardinality>
<owl:onProperty>
<owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20562107/1281433/JeVysledkom"/>
</owl:onProperty>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
</rdf:RDF>
在 Protégé:
关于java - 如何在 JENA 中添加合格的基数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20562107/