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)
あなたが持っている場合、それがあなたがここで望むものだと思います:
- 機能(左)
- 左(o 1 ,o 2 )
- 左(o 2 ,o 3 )
- o 1 ≠ o 2
- o 1 ≠ o 3
- 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 .