代码之家  ›  专栏  ›  技术社区  ›  Ali Ben Messaoud

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

  •  1
  • Ali Ben Messaoud  · 技术社区  · 12 年前

    我编写这段代码是为了创建对象之间的关系。

    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>
    

    我想对这些Object财产添加限制,使它们成为非传递的。例如,如果我有三个对象O1、O2&O3,我可以推断:

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

    enter image description here

    并且不允许O1离开O3&O3右O1。

    enter image description here

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

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

    1 回复  |  直到 12 年前
        1
  •  2
  •   Joshua Taylor    12 年前

    函数性质和最小基数限制

    根据您的图像,看起来您正在尝试表示类似于双链接列表的内容。虽然在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)

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

    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. )&V形; 左边 (o) 1. ,o 3. )

    但是,到了(2),我们已经

    左边 (o) 1. ,o 3. )

    我认为,这就是你想要的“非及物性”。这也限制了每个节点最多只能有一个 左边 所有物如果还希望确保每个节点都具有 至少 一个值 左边 属性,可以使用最小基数限制:

    节点 &sqsubsteq&geq;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&leq;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 .