我制作了这段代码来创建对象之间的关系。
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&amp; O3,我可以推断出:
O1离开O2,O2离开O1,O2离开O3,O3离开O2。
并且不允许O1离开O3&amp; O3对O1。
我发现有可能创建传递属性,但对于非传递属性,我不知道该怎么做。
此外,如何添加基数限制来表示一个对象。
答案 0 :(得分:2)
根据您的图片,您似乎想要表示类似双向链接列表的内容。虽然你可以在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 )∨¬ left (o 1 < / sub>,o 3 )
然后,通过(2),我们有
我认为,这是你想要的“非传递性”。这也限制每个节点最多具有 left 属性的一个值。如果您还想确保每个节点至少 left 属性的一个值,您可以使用最小基数限制:¬左(o 1 ,o 3 )
节点⊑≥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 .