Как я могу написать следующее в Йене? - PullRequest
0 голосов
/ 09 декабря 2011

Как мне написать оператор Jena для следующего:

:process1 sio:' is denoted by' : process effect_result


' is denoted by' это просто метка, а sio это пространство имен в http://semanticscience.org/resource/.

1 Ответ

2 голосов
/ 11 декабря 2011

Сначала вам нужно определить онтологию, в которой определяются ваши свойства. Это не строго необходимо, но это определенно хорошая практика. В идеале ваша онтология должна быть доступна в Интернете по адресу пространства имен, который вы ей назначаете (http://semanticscience.org/resource в вашем случае). Вот возможный фрагмент онтологии, если я понимаю, что вы пытаетесь смоделировать:

@prefix sio: <http://semanticscience.org/resource/>.
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .

<> a owl:Ontology;
    rdfs:label "Process ontology";
    dc:author "hamid";
.

sio:denotedBy
    a owl:ObjectProperty;
    rdfs:domain sio:Process;
    rdfs:range sio:ProcessEffect;
    rdfs:label "is denoted by"@en;
.

В вашем Java-коде вам просто нужно сослаться на URI, определенные в вашей онтологии. В общем, есть два способа сделать это:

  • определите вручную константы в вашем коде
  • использовать Jena для автоматической генерации констант Java из файла онтологии

Во втором подходе используется инструмент Jena schemagen . На самом деле я бы порекомендовал использовать этот подход, но для начала вам может быть проще просто определить константы вручную в вашем коде. Основным недостатком этого является сопровождение программы: если вы в будущем измените файл онтологии, вам нужно помнить об обновлении созданных вручную констант, в противном случае вы обнаружите, что пытаетесь отследить ошибки, которые внезапно появились в вашем коде.

Вот пример класса, который определяет константы вручную, а затем определяет process1 со ссылкой на processEffect1:

package test;


// Imports
///////////////

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.ontology.*;

public class ProcessTest
{
    @SuppressWarnings( value = "unused" )
    private static final Logger log = LoggerFactory.getLogger( ProcessTest.class );

    public static final String SIO = "http://semanticscience.org/resource/";
    public static final Resource Process = ResourceFactory.createResource( SIO + "Process" );
    public static final Resource ProcessEffect = ResourceFactory.createResource( SIO + "ProcessEffect" );
    public static final Property denotedBy = ResourceFactory.createProperty( SIO + "denotedBy" );

    public void run() {
        // create a model to hold the RDF statements we want to define
        OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );

        // inform m about the sio: prefix - not necessary, but makes the output prettier
        m.setNsPrefix( "sio", SIO );

        // create the individual for the process being defined
        Individual p1 = m.createIndividual( SIO + "process1", Process );

        // create the individual for the process effect
        Individual pe1 = m.createIndividual( SIO + "processEffect1", ProcessEffect );

        // the process is denoted by the effect
        p1.addProperty( denotedBy, pe1 );

        // for illustration, we just print the contents of the model now
        m.write( System.out, "Turtle" );
    }

    public static void main( String[] args ) {
        new ProcessTest().run();
    }
}

, который производит следующий вывод:

@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sio:     <http://semanticscience.org/resource/> .
@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#> .

sio:processEffect1
      a       sio:ProcessEffect .

sio:process1
      a       sio:Process ;
      sio:denotedBy sio:processEffect1 .
...