Сначала вам нужно определить онтологию, в которой определяются ваши свойства. Это не строго необходимо, но это определенно хорошая практика. В идеале ваша онтология должна быть доступна в Интернете по адресу пространства имен, который вы ей назначаете (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 .