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,我可以推断:

O1 左 O2,O2 右 O1,O2 左 O3,O3 右 O2。

在此处输入图像描述

并且不允许O1左O3和O3右O1。

在此处输入图像描述

我发现有可能创建传递属性,但对于非传递属性,我不知道该怎么做。

此外,如何添加基数限制来并排表示一个对象。

4

1 回答 1

2

功能属性和最小基数限制

根据您的图像,您似乎正在尝试表示类似双向链表的内容。虽然您可以在 OWL 中使属性具有传递性,但没有关于属性p的构造可以说:

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

通过简单地不声明属性传递性,您可以拥有p (a,b) 和p (b,c) 并​​且可以说,对于p (a,c) 是否成立,保持不可知论。但是,在您描述的情况下,听起来您希望leftright属性能够正常工作。当属性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

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 .
于 2014-03-24T13:57:56.317 回答