功能属性和最小基数限制
根据您的图像,您似乎正在尝试表示类似双向链表的内容。虽然您可以在 OWL 中使属性具有传递性,但没有关于属性p的构造可以说:
(A) p (a,b) ∧ p (b,c) → ¬ p (a,c)。
通过简单地不声明属性传递性,您可以拥有p (a,b) 和p (b,c) 并且可以说,对于p (a,c) 是否成立,保持不可知论。但是,在您描述的情况下,听起来您希望left和right属性能够正常工作。当属性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左
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 .
精确基数限制
当然,请注意,具有功能的属性实际上与最大基数限制和子类公理是一回事,通过它您可以说一切都使得它最多具有一个属性值:
⊤ ⊑ ≤ 1 p与泛 函( p ) 相同。
对于您的left属性,您可能会采用更简单的方法,只需断言每个Node的left属性都只有一个值:
节点 ⊑ = 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 .