Определение OWL ObjectProperty в Jena с доменом и диапазоном не выводится

1

Я пытаюсь создать онтологию, использующую API Jena, и выход будет в OWL, как показано на рисунке.

import com.hp.hpl.jena.ontology.Individual;
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 BandsOntology {

    public static void main(String[] args) 
    {
        // Create an empty ontology model
        OntModel m = ModelFactory.createOntologyModel();
        String baseURI = "http://www.bands.fr";
        String NSBand = baseURI + "#";

        m.setNsPrefix("Band", NSBand);

        OntClass Band = m.createClass(NSBand + "Band");
        OntClass Guitarist = m.createClass(NSBand + "Guitarist");
        OntClass Bassist = m.createClass(NSBand + "Bassist");
        OntClass Keyboardist = m.createClass(NSBand + "Keyboardist");
        OntClass Vocalist  = m.createClass(NSBand + "Vocalist ");

        ObjectProperty bandComposedBy = m.createObjectProperty(NSBand +"composedBy");
        bandComposedBy.hasDomain(Band);
        bandComposedBy.hasRange(Guitarist);
        bandComposedBy.hasRange(Bassist);
        bandComposedBy.hasRange(Keyboardist);       
        bandComposedBy.hasRange(Vocalist);      

        Individual queen = Band.createIndividual(NSBand + "Queen");
        Individual guitarist01 = Guitarist.createIndividual(NSBand + "guita01");        

        m.add(queen, bandComposedBy, guitarist01);

        m.write(System.out, Constants.TYPE_RDF_XML_ABBREV);

    }

}

И вывод на консоли:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:Band="http://www.bands.fr#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Class rdf:about="http://www.bands.fr#Bassist"/>
  <owl:Class rdf:about="http://www.bands.fr#Band"/>
  <owl:Class rdf:about="http://www.bands.fr#Vocalist "/>
  <owl:Class rdf:about="http://www.bands.fr#Keyboardist"/>
  <owl:Class rdf:about="http://www.bands.fr#Guitarist"/>
  <owl:ObjectProperty rdf:about="http://www.bands.fr#composedBy"/>
  <Band:Band rdf:about="http://www.bands.fr#Queen">
    <Band:composedBy>
      <Band:Guitarist rdf:about="http://www.bands.fr#guita01"/>
    </Band:composedBy>
  </Band:Band>
</rdf:RDF>

Я спрашиваю, почему после объявления свойства я не получил свойство "createdBy", объявленное как кодированное.

<owl:ObjectProperty rdf:about="http://www.bands.fr#composedBy">
    <rdfs:domain rdf:resource="http://www.bands.fr#Band"/>
    <rdfs:range rdf:resource="http://www.bands.fr#Bassist"/>
    <rdfs:range rdf:resource="http://www.bands.fr#Guitarist"/>
    ...
</owl:ObjectProperty>
Теги:
jena
owl
rdf
object-property

1 ответ

1
Лучший ответ

hasDomain и hasRange не добавляют домены и диапазоны, они просто возвращают true, если свойство имеет указанный домен и диапазон. Это объясняется в Javadoc для этих методов и следует типичному соглашению об именах в Java, что методы, начинающиеся с has- или is-, возвращают true, если объект удовлетворяет некоторому условию.

Вместо этого следует использовать addDomain и addRange. То есть вместо

bandComposedBy.hasDomain(Band);
bandComposedBy.hasRange(Guitarist);
bandComposedBy.hasRange(Bassist);
bandComposedBy.hasRange(Keyboardist);       
bandComposedBy.hasRange(Vocalist);   

вы должны использовать:

bandComposedBy.addDomain(Band);
bandComposedBy.addRange(Guitarist);
bandComposedBy.addRange(Bassist);
bandComposedBy.addRange(Keyboardist);       
bandComposedBy.addRange(Vocalist);   

Ещё вопросы

Сообщество Overcoder
Наверх
Меню