Mic*_*iak 4 java rdf owl jena description-logic
如何在耶拿添加合格的基数限制?我不能使用,createCardinalityQRestriction因为它OntModelSpec是OWL的第一个版本,而不是OWL2.在ModelFactory的createOntologyModel中,有没有办法创建OWL2本体?我需要一个类表达式
JeVysledkom 正好 1 Kolik_Fazovy
我试过使用这段代码:
OntModel ontModel = ModelFactory.createOntologyModel();
OntClass ret = ontModel.createCardinalityQRestriction(null, ontProperty, cardinality, ontClass2 );
ontClass.addSuperClass(ret);
Run Code Online (Sandbox Code Playgroud)
但我得到这个例外:
com.hp.hpl.jena.ontology.ProfileException:尝试使用当前语言配置文件不支持的语言构造CARDINALITY_Q:OWL Full
我实际上只是遇到了另一个问题,添加更复杂的子类公理.在Jena中创建它有点棘手,因为对合格基数限制的支持是OWL2功能,而Jena对OWL2的支持有限:
Jena Ontology API
请注意,目前,Jena本体API仅对OWL2的合格基数限制(即cardinalityQ,minCardinalityQ和maxCardinalityQ)提供有限的支持.合格的基数限制封装在接口CardinalityQRestriction,MinCardinalityQRestriction和CardinalityQRestriction中.OntModel还提供了创建和访问合格基数限制的方法.由于它们不是OWL 1.0语言定义的一部分,因此OWL本体不支持合格的基数限制.OWL 2更新中添加了合格的基数限制.Jena的OWL2支持将在适当时候添加.
OWL2词汇.注意:Jena不提供OWL2推理或OntModel支持.提供这些常量是为了方便正在使用当前OWL1支持进行OWL2工作并希望获得一组合适名称的用户.
您可能还会看到我在Jena邮件列表中发布的关于类似问题的回复,Re:Owl maxCardinality限制.
但是你想创建一个呢?那么你就是其中一个"正在使用当前OWL1支持并且需要一组合适名称的OWL2工作的用户."为了找出如何在RDF中序列化OWL2结构,我们需要看看OWL 2 Web本体语言映射到RDF图(第二版),特别是第2节从结构规范映射到RDF图,它告诉我们类表达式
ObjectExactCardinality( n OPE CE )
Run Code Online (Sandbox Code Playgroud)
被序列化为以下三元组
_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:qualifiedCardinality "n"^^xsd:nonNegativeInteger .
_:x owl:onClass T(CE) .
Run Code Online (Sandbox Code Playgroud)
哪个_:x是类的资源.耶拿已经处理过的不合格案件就转了
ObjectExactCardinality( n OPE )
Run Code Online (Sandbox Code Playgroud)
成
_:x rdf:type owl:Restriction .
_:x owl:onProperty T(OPE) .
_:x owl:cardinality "n"^^xsd:nonNegativeInteger .
Run Code Online (Sandbox Code Playgroud)
如果我们有后者之一,我们可以用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" );
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
<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>
Run Code Online (Sandbox Code Playgroud)
在Protégé:
