如何使用Jena在OWL中添加非传递属性以获取知识

时间:2014-03-23 09:28:32

标签: rdf jena owl inference

我制作了这段代码来创建对象之间的关系。

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。

enter image description here

并且不允许O1离开O3&amp; O3对O1。

enter image description here

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

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

1 个答案:

答案 0 :(得分:2)

FunctionalProperties和MinCardinality限制

根据您的图片,您似乎想要表示类似双向链接列表的内容。虽然你可以在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)

我认为这就是你想要的,因为如果你有:

  
      
  1. 功能性(
  2.   
  3. (o 1 ,o 2
  4.   
  5. (o 2 ,o 3
  6.   
  7. o 1 ≠o 2
  8.   
  9. o 1 ≠o 3
  10.   
  11. o 2 ≠o 3
  12.   

然后从(C)和(6),我们可以推断出

  

¬(o 1 ,o 2 )∨¬ left (o 1 < / sub>,o 3

然后,通过(2),我们有

  

¬(o 1 ,o 3

我认为,这是你想要的“非传递性”。这也限制每个节点最多具有 left 属性的一个值。如果您还想确保每个节点至少 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 .

ExactCardinality限制

当然,请注意,正在运行的属性实际上与最大基数限制和子类公理完全相同,您可以通过该公理说所有使得它最多具有一个值属性:

  

⊤⊤≤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 .