1

オブジェクト間の関係を作成するためにこのコードを作成しました。

OntClass Object = m.createClass(NS + Constants.Object);

ObjectProperty left = m.createObjectProperty(NS + Constants.left);
left.addDomain(Object);
left.addRange(Object);

ObjectProperty right = m.createObjectProperty(NS + Constants.right);
right.addDomain(Object);
right.addRange(Object);

出力として、私は得ました

<owl:ObjectProperty rdf:about="http://www.mydomain.com/ns1.owl#left">
  <rdfs:range rdf:resource="http://www.mydomain.com/ns1.owl#Object"/>
  <rdfs:domain rdf:resource="http://www.mydomain.com/ns1.owl#Object"/>
</owl:ObjectProperty>

<owl:ObjectProperty rdf:about="http://www.mydomain.com/ns1.owl#right">
  <rdfs:range rdf:resource="http://www.mydomain.com/ns1.owl#Object"/>
  <rdfs:domain rdf:resource="http://www.mydomain.com/ns1.owl#Object"/>
</owl:ObjectProperty>

これらのオブジェクト プロパティに制限を追加し、それらを非推移的にしたいと考えています。たとえば、O1、O2、O3 の 3 つのオブジェクトがある場合、次のように推測できます。

O1 左 O2、O2 右 O1、O2 左 O3、O3 右 O2。

ここに画像の説明を入力

O1 左 O3 と O3 右 O1 を許可しません。

ここに画像の説明を入力

推移的なプロパティを作成する可能性があることがわかりましたが、非推移的なプロパティの場合はどうすればよいかわかりませんでした。

さらに、カーディナリティ制限を追加して、1 つのオブジェクトを並べて表すにはどうすればよいですか。

4

1 に答える 1

2

FunctionalProperties と MinCardinality の制限

あなたのイメージに基づいて、双方向にリンクされたリストのようなものを表現しようとしているようです。OWLでは、プロパティーを推移的にすることができますが、プロパティーpについて次のように言う構造はありません。

(A)     p (a,b) ∧ p (b,c) → ¬ p (a,c)。

プロパティが推移的であると宣言しないだけで、p (a,b) とp (b,c) を持つことができ、いわば、p (a,c) が成立するかどうかについて不可知のままになります。ただし、説明しているように見える場合は、左右プロパティを機能させたいようです。プロパティpが機能する場合、次のことを意味します。

(B)     p (a,b) ∧ p (a,c) → b = c

もちろん、論理的に同等の対比は次のとおりです。

(C)     b ≠ c → ¬p (a, b ) ∨¬p ( a,c)

あなたが持っている場合、それがあなたがここで望むものだと思います:

  1. 機能(
  2. (o 1 ,o 2 )
  3. (o 2 ,o 3 )
  4. o 1 ≠ o 2
  5. o 1 ≠ o 3
  6. o 2 ≠ o 3

次に、(C)と (6) から、次のように推測できます。

¬(o 1 ,o 2 ) ∨ ¬(o 1 ,o 3 )

しかし、(2) により、

¬(o 1 ,o 3 )

これは、あなたが望んでいた「非推移性」だと思います。これにより、各ノードがleftプロパティの値を最大 1 つ持つようにも制限されます。また、各ノードにleftプロパティの値が少なくとも1 つあることを確認したい場合は、最小カーディナリティ制限を使用できます。

ノード⊑ ≥1

import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class MinCardinalityExample {
    public static void main(String[] args) {
        String NS = "http://stackoverflow.com/q/22589068/1281433/";
        OntModel model = ModelFactory.createOntologyModel();
        model.setNsPrefix( "", NS );

        OntClass node = model.createClass( NS+"Node" );

        ObjectProperty left = model.createObjectProperty( NS+"left" )
                .convertToFunctionalProperty()
                .asObjectProperty();

        node.addSuperClass( model.createMinCardinalityRestriction( null, left, 1 ));

        model.write( System.out, "TTL" );
    }
}
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:Node   a                owl:Class ;
        rdfs:subClassOf  [ a                   owl:Restriction ;
                           owl:minCardinality  "1"^^xsd:int ;
                           owl:onProperty      :left
                         ] .

:left   a       owl:FunctionalProperty , owl:ObjectProperty .

ExactCardinality の制限

もちろん、プロパティが機能することは、最大カーディナリティの制限や、すべてがプロパティに対して最大で 1 つの値を持つようなものであると言うサブクラスの公理と実際には同じものであることに注意してください。

⊤ ⊑ ≤ 1 pは Functional( p )    と同じです。

のプロパティの場合は、より単純なルートを使用して、各ノードがのプロパティの値を 1 つだけ持っていることをアサートすることができます。

ノード ⊑ =残り1

import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class ExactlyCardinalityExample {
    public static void main(String[] args) {
        String NS = "http://stackoverflow.com/q/22589068/1281433/";
        OntModel model = ModelFactory.createOntologyModel();
        model.setNsPrefix( "", NS );
        OntClass node = model.createClass( NS+"Node" );
        ObjectProperty left = model.createObjectProperty( NS+"left" );
        node.addSuperClass( model.createCardinalityRestriction( null, left, 1 ));
        model.write( System.out, "TTL" );
    }
}
@prefix :      <http://stackoverflow.com/q/22589068/1281433/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:Node   a                owl:Class ;
        rdfs:subClassOf  [ a                owl:Restriction ;
                           owl:cardinality  "1"^^xsd:int ;
                           owl:onProperty   :left
                         ] .

:left   a       owl:ObjectProperty .
于 2014-03-24T13:57:56.317 に答える