我可以从jena向对象属性断言添加注释吗?

时间:2013-09-14 11:46:57

标签: jena ontology protege

我想在对象属性断言中添加注释(注释),如下所示。

  

移动→hasCamera→8MP

我能够将此特定断言作为Statement对象。现在我想为这个语句对象添加注释,但是Jena没有任何直接方法可以做到这一点。另一方面,我可以在Protege工具中轻松实现这一点。那么这只是Protégé的一个特点,还是有任何可能的方法与Jena一起做到这一点?

基本上,我对此感兴趣,为两个资源之间的属性(链接)添加权重分数即。移动和8MP。

1 个答案:

答案 0 :(得分:2)

Jena,虽然它通过OntModels对OWL有一些支持,但它实际上是一个基于RDF的API。耶拿的陈述只是代表三元组的一个类,并不代表资源。如果要创建带注释的对象属性断言,则需要查看Section 2.3 Translation of Axioms with Annotations中的OWL 2 Web Ontology Language Mapping to RDF Graphs。具体来说,看起来2.3.1 Axioms that Generate a Main Triple就是您想要的:

  

如果表1中对应于ax'类型的行包含a   单主要三重s pxl。,然后公理ax被翻译成   以下三元组:

s p xlt .
_:x rdf:type owl:Axiom .
_:x owl:annotatedSource s .
_:x owl:annotatedProperty p .
_:x owl:annotatedTarget xlt .
TANN(annotation1, _:x)
...
TANN(annotationm, _:x)
     

如果ax'的类型为... ObjectPropertyAssertion ...。

,则会出现这种情况

引用的表1出现在2.1 Translation of Axioms without Annotations部分的前面。

所以,添加三联

Mobile hasCamera 8MP

带注释

hasWeightScore 6.7

您可以使用以下代码:

import com.hp.hpl.jena.ontology.AnnotationProperty;
import com.hp.hpl.jena.ontology.Individual;
import com.hp.hpl.jena.ontology.ObjectProperty;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.vocabulary.OWL;
import com.hp.hpl.jena.vocabulary.OWL2;

public class AnnotatedAxioms {
    public static void main(String[] args) {
        final String ns = "http://example.org/";
        final OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM );
        model.setNsPrefix( "ex", ns );

        final Individual mobile = model.createIndividual( ns+"Mobile", OWL.Thing );
        final ObjectProperty hasCamera  = model.createObjectProperty( ns+"hasCamera" );
        final Individual eightMP = model.createIndividual( ns+"8MP", OWL.Thing );

        final AnnotationProperty hasWeightScore = model.createAnnotationProperty( ns+"hasWeightScore" );

        final Resource axiom = model.createResource( OWL2.Axiom );
        axiom.addProperty( OWL2.annotatedSource, mobile );
        axiom.addProperty( OWL2.annotatedProperty, hasCamera );
        axiom.addProperty( OWL2.annotatedTarget, eightMP );
        axiom.addLiteral( hasWeightScore, 6.7 );

        model.write( System.out, "RDF/XML-ABBREV" );
    }
}

产生以下本体:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:ex="http://example.org/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:ObjectProperty rdf:about="http://example.org/hasCamera"/>
  <owl:AnnotationProperty rdf:about="http://example.org/hasWeightScore"/>
  <owl:Axiom>
    <ex:hasWeightScore rdf:datatype="http://www.w3.org/2001/XMLSchema#double"
    >6.7</ex:hasWeightScore>
    <owl:annotatedTarget>
      <owl:Thing rdf:about="http://example.org/8MP"/>
    </owl:annotatedTarget>
    <owl:annotatedProperty rdf:resource="http://example.org/hasCamera"/>
    <owl:annotatedSource>
      <owl:Thing rdf:about="http://example.org/Mobile"/>
    </owl:annotatedSource>
  </owl:Axiom>
</rdf:RDF>