函数性质和最小基数限制
根据您的图像,看起来您正在尝试表示类似于双链接列表的内容。虽然在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)和;V形;
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.
)&V形;
左边
(o)
1.
,o
3.
)
但是,到了(2),我们已经
左边
(o)
1.
,o
3.
)
我认为,这就是你想要的“非及物性”。这也限制了每个节点最多只能有一个
左边
所有物如果还希望确保每个节点都具有
至少
一个值
左边
属性,可以使用最小基数限制:
节点
&sqsubsteq≥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 .
精确基数限制
当然,请注意,一个函数性质实际上与一个最大基数限制和一个子类公理是一样的
每件事
该属性最多有一个值:
&顶部&sqsubsteq≤1.
p
与功能相同(
p
).
对于您的
左边
属性,您可以采取更简单的路线,只需断言每个
节点
只有一个值
左边
属性:
节点&sqsubsteq;=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 .