2

別の問題に遭遇しました...

私はこれに似た何かを達成したい: ここに画像の説明を入力

RDFList を使用して、必要なプロパティをリストに追加し、メソッド createUnionClass (または createIntersectionClass) を呼び出して結合したいと考えました。次に、このメソッドの結果は、addSuperClass() を使用して特定の ontClass に追加されます。

これは間違っていますか?私は、次のような非常に単純なものから始めました。

RDFList rdfList = ontModel.createList();
rdfList.addProperty(ExampleResource1);
rdfList.addProperty(ExampleResource2); 
UnionClass uc = ontModel.createUnionClass(null, rdfList);
ExampleClass.addSuperClass(uc);

しかし、結果は前述の両方の和集合の subClassOf ではなく、subClassOf nil だけでした。

どんな助けでも大歓迎です。

4

1 に答える 1

2

これを Jena で作成するのは少し注意が必要です。修飾カーディナリティ制限のサポートは OWL2 機能であり、Jena は OWL2 のサポートを制限しているためです。

イエナ オントロジー API

現在、Jena オントロジー API は、OWL2 の修飾されたカーディナリティ制限 (つまり、cardinalityQ、minCardinalityQ、および maxCardinalityQ) の限定的なサポートのみを持っていることに注意してください。修飾されたカーディナリティ制限は、インターフェイス CardinalityQRestriction、MinCardinalityQRestriction、および CardinalityQRestriction にカプセル化されています。OntModel は、修飾されたカーディナリティ制限を作成およびアクセスするためのメソッドも提供します。これらは OWL 1.0 言語定義の一部ではないため、OWL オントロジーでは修飾カーディナリティ制限はサポートされていません。OWL 2 の更新では、限定カーディナリティ制限が追加されました。Jena での OWL2 サポートは、やがて追加される予定です。

同様の質問について、私がJenaメーリング リストに投稿した応答も表示される場合があります。

ただし、次の Java コードを使用すると、かなり近づくことができます。 3.は、記述できるようにしたいコードですが、3a.代わりに使用する必要があります。RDF シリアライゼーションを掘り下げ始めると、本物の修飾された制限を取得できます。関連する質問でそれを行う方法を示しました:JENA で修飾されたカーディナリティを追加する方法

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.RDFNode;

public class UnionClassExample {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        String NS = "https://stackoverflow.com/q/20561994/1281433/";
        OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
        model.setNsPrefix( "so", NS );

        OntClass a = model.createClass( NS+"A" );
        OntClass b = model.createClass( NS+"B" );
        OntClass c = model.createClass( NS+"C" );

        OntProperty p = model.createObjectProperty( NS+"p" );
        OntProperty q = model.createObjectProperty( NS+"q" );

        // 1. B or C
        OntClass b_or_c = model.createUnionClass( null, model.createList( new RDFNode[] { b, c } ));

        // 2. p only (B or C)
        OntClass p_only_b_or_c = model.createAllValuesFromRestriction( null, p, b_or_c );

        // 3. q exactly 1 C
        // OntClass q_exactly_1_C = model.createCardinalityQRestriction( null, q, 1, c );

        // 3a. q exactly 1
        OntClass q_exactly_1 = model.createCardinalityRestriction( null, q, 1 );

        // (2) and (3a)
        OntClass _2_and_3a = model.createIntersectionClass( null, model.createList( new RDFNode[] { p_only_b_or_c, q_exactly_1 } ));

        // a subClassOf ((p only (B or C)) and (q exactly 1))
        a.addSuperClass( _2_and_3a );

        model.write( System.out, "RDF/XML-ABBREV" );
    }
}

出力:

<rdf:RDF
    xmlns:so="https://stackoverflow.com/q/20561994/1281433/"
    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/20561994/1281433/A">
    <rdfs:subClassOf>
      <owl:Class>
        <owl:intersectionOf rdf:parseType="Collection">
          <owl:Restriction>
            <owl:allValuesFrom>
              <owl:Class>
                <owl:unionOf rdf:parseType="Collection">
                  <owl:Class rdf:about="https://stackoverflow.com/q/20561994/1281433/B"/>
                  <owl:Class rdf:about="https://stackoverflow.com/q/20561994/1281433/C"/>
                </owl:unionOf>
              </owl:Class>
            </owl:allValuesFrom>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20561994/1281433/p"/>
            </owl:onProperty>
          </owl:Restriction>
          <owl:Restriction>
            <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#int"
            >1</owl:cardinality>
            <owl:onProperty>
              <owl:ObjectProperty rdf:about="https://stackoverflow.com/q/20561994/1281433/q"/>
            </owl:onProperty>
          </owl:Restriction>
        </owl:intersectionOf>
      </owl:Class>
    </rdfs:subClassOf>
  </owl:Class>
</rdf:RDF>

Protégé にロード:

ここに画像の説明を入力

于 2013-12-13T14:05:41.280 に答える