Определение OWL ObjectProperty в Jena с доменом и диапазоном не выводится
Я пытаюсь создать Ontology с помощью Jena API, и результат будет в 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>
Я спрашиваю, почему после объявления свойства я не получил объявленное свойство "compoBy" в кодированном виде.
<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>
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);