如何在 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/

10-12 04:55