2. Outline
What is Jena ?
Reading an Existing Ontology
Classes
Properties
Individuals
Creating a New Ontology
30/03/2010
Classes
Properties
Individuales
2
3. What is Jena ?
Jena is a Java framework
for building Semantic Web applications
includes
30/03/2010
an RDF API
reading and writing RDF in RDF/XML, N3 and N-Triples
an OWL API
in-memory and persistent storage
SPARQL query engine
http://jena.sourceforge.net/
3
5. Outline
What is Jena ?
Reading an Existing Ontology
Classes
Properties
Individuals
Creating a New Ontology
30/03/2010
Classes
Properties
Individuales
5
6. Create Ontology Model
Jena provides an ontology model that allows to specify:
Ontology language
Storage model
Inference mode
OntModel model = ModelFactory.createOntologyModel();
default settings:
30/03/2010
OWL-Full language
in-memory storage
RDFS inference
6
7. OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
OntModelSpec
Language profile
Storage model
Reasoner
OWL_MEM
OWL full
in-memory
none
OWL_MEM_TRANS_INF
OWL full
in-memory
transitive class-hierarchy inference
OWL_MEM_RULE_INF
OWL full
in-memory
rule-based reasoner with OWL rules
OWL_MEM_MICRO_RULE_INF
OWL full
in-memory
optimised rule-based reasoner with OWL rules
OWL_MEM_MINI_RULE_INF
OWL full
in-memory
rule-based reasoner with subset of OWL rules
OWL_DL_MEM
OWL DL
in-memory
none
OWL_DL_MEM_RDFS_INF
OWL DL
in-memory
rule reasoner with RDFS-level entailment-rules
OWL_DL_MEM_TRANS_INF
OWL DL
in-memory
transitive class-hierarchy inference
OWL_DL_MEM_RULE_INF
OWL DL
in-memory
rule-based reasoner with OWL rules
OWL_LITE_MEM
OWL Lite
in-memory
none
OWL_LITE_MEM_TRANS_INF
OWL Lite
in-memory
transitive class-hierarchy inference
OWL_LITE_MEM_RDFS_INF
OWL Lite
in-memory
rule reasoner with RDFS-level entailment-rules
OWL_LITE_MEM_RULES_INF
OWL Lite
in-memory
rule-based reasoner with OWL rules
DAML_MEM
DAML+OIL
in-memory
none
DAML_MEM_TRANS_INF
DAML+OIL
in-memory
transitive class-hierarchy inference
DAML_MEM_RDFS_INF
DAML+OIL
in-memory
rule reasoner with RDFS-level entailment-rules
DAML_MEM_RULE_INF
DAML+OIL
in-memory
rule-based reasoner with DAML rules
RDFS_MEM
RDFS
in-memory
none
RDFS_MEM_TRANS_INF
RDFS
in-memory
transitive class-hierarchy inference
RDFS_MEM_RDFS_INF
RDFS
in-memory
rule reasoner with RDFS-level entailment-rules
30/03/2010
7
8. Read a File into Ontology Model
String fileName = "univ.owl";
try {
File file = new File(fileName);
FileReader reader = new FileReader(file);
OntModel model = ModelFactory
.createOntologyModel(OntModelSpec.OWL_DL_MEM);
model.read(reader,null);
model.write(System.out,"RDF/XML-ABBREV");
} catch (Exception e) {
e.printStackTrace();
}
30/03/2010
8
9. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Retrieve Ontology Classes
Iterator classIter = model.listClasses();
while (classIter.hasNext()) {
OntClass ontClass = (OntClass) classIter.next();
String uri = ontClass.getURI();
if(uri != null)
System.out.println(uri);
}
We can also use ontClass.getLocalName() to get the class name only.
If a class has no name (e.g. a restriction class), then ontClass.getURI()
returns null.
http://www.something.com/myontology#Professor
http://www.something.com/myontology#Module
http://www.something.com/myontology#Diploma
http://www.something.com/myontology#Person
http://www.something.com/myontology#Student
30/03/2010
output
9
10. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Retrieve a Specified Class
A specifed class is called by its URI
String classURI = "http://www.something.com/myontology#Professor";
OntClass professor = model.getOntClass(classURI );
// ...
If we know the class name only, we can get its URI by concatenating the
ontology URI with the class name:
ClassURI = OntologyURI + ‘#’ + ClassName
30/03/2010
10
11. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Get the Ontology URI
String ontologyURI = null;
Iterator iter = model.listOntologies();
if(iter.hasNext()){
Ontology onto = (Ontology) iter.next();
ontologyURI = onto.getURI();
System.out.println("Ontology URI = "+ontologyURI);
}
String className = "Professor";
String classURI = ontologyURI+"#"+className;
OntClass professor = model.getOntClass(classURI );
30/03/2010
11
12. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Class Hierarchy
OntClass student = model.getOntClass(uri+"#Student");
System.out.println(student.getSuperClass());
System.out.println(student.getSubClass());
http://www.something.com/myontology#Person
null
OntClass person = model.getOntClass(uri+"#Person");
System.out.println(person.getSuperClass());
System.out.println(person.getSubClass());
null
http://www.something.com/myontology#Professor
30/03/2010
12
13. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Class Hierarchy
Iterator supIter = person.listSuperClasses();
while (supIter.hasNext()) {
OntClass sup = (OntClass) supIter.next();
System.out.println(sup);
}
System.out.println("----------------");
Iterator subIter = person.listSubClasses();
while (subIter.hasNext()) {
OntClass sub = (OntClass) subIter.next();
System.out.println(sub);
}
---------------http://www.something.com/myontology#Professor
http://www.something.com/myontology#Student
30/03/2010
13
14. Reading an Existing Ontology
Creating a New Ontology
Classes
Properties
Individuales
Class Hierarchy
true
direct sub-classes
false
all sub-classes (default)
true
direct super-classes
false
all super-classes (default)
listSubClasses(boolean)
listSuperClasses(boolean)
A
B, C
->
B, C, D
D.listSuperClasses(true)
->
C
C
D
30/03/2010
->
A.listSubClasses(false)
B
A.listSubClasses(true)
D.listSuperClasses(false) ->
C, A
14
15. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Class Hierarchy
<OntClass>.isHierarchyRoot()
This function returns true if this class is the root of the class
hierarchy in the model:
this class has owl:Thing as a direct super-class,
or it has no declared super-classes
owl:Thing
Professor
Person
30/03/2010
Module
Diploma
Student
15
16. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Intersection / Union / Complement
if(ontClass.isIntersectionClass()){
IntersectionClass intersection = ontClass.asIntersectionClass();
RDFList operands = intersection.getOperands();
for (int i = 0; i < operands.size(); i++) {
RDFNode rdfNode = operands.get(i);
...
}
} else if(ontClass.isUnionClass()){
UnionClass union = ontClass.asUnionClass();
RDFList operands = union.getOperands();
...
} else if(ontClass.isComplementClass()){
ComplementClass compl = ontClass.asComplementClass();
RDFList operands = compl.getOperands();
...
}
30/03/2010
16
17. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Retrieve the Properties of a Specified Class
OntClass student = model.getOntClass(uri+"#Student");
Iterator propIter = student.listDeclaredProperties();
while (propIter.hasNext()) {
OntProperty property = (OntProperty) propIter.next();
System.out.println(property.getLocalName());
}
output
studentNumber
age
personName
enrolledIn
email
true
directly associated properties
false
all properties (direct + inhereted)
listDeclaredProperties(boolean)
(default)
30/03/2010
17
18. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Property Types
1
Two ways to know whether a property is datatype property or
object property:
if(property.isObjectProperty()){
// ... this is an object property
} else if (property.isDatatypeProperty()){
// ... this is an datatype property
}
property.isFunctionalProperty();
property.isSymmetricProperty();
property.isTransitiveProperty();
property.isInverseOf(anotherProperty);
30/03/2010
18
19. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Property Types
Two ways to know whether a property is datatype property or
object property:
Resource propertyType = property.getRDFType();
System.out.println(propertyType);
2
if(propertyType.equals(OWL.DatatypeProperty)){
// ... this is an datatype property
} else if(propertyType.equals(OWL.ObjectProperty)){
// ... this is an object property
}
http://www.w3.org/2002/07/owl#DatatypeProperty
http://www.w3.org/2002/07/owl#DatatypeProperty
http://www.w3.org/2002/07/owl#DatatypeProperty
http://www.w3.org/2002/07/owl#ObjectProperty
http://www.w3.org/2002/07/owl#DatatypeProperty
30/03/2010
output
19
20. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Property Domain and Range
String propertyName = property.getLocalName();
String dom = "";
String rng = "";
if(property.getDomain()!=null)
dom = property.getDomain().getLocalName();
if(property.getRange()!=null)
rng = property.getRange().getLocalName();
System.out.println(propertyName +": t("+dom+") t -> ("+rng+") ");
listDeclaredProperties(boolean);
true
studentNumber:
enrolledIn:
(Student)
(Student)
false
studentNumber:
age:
personName:
enrolledIn:
email:
(Student)
(Person)
(Person)
(Student)
(Person)
30/03/2010
-> (string)
-> (Diploma)
->
->
->
->
->
output
(string)
(int)
(string)
(Diploma)
(string)
20
21. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Datatype Properties
list all datatype properties in the model:
Iterator iter = model.listDatatypeProperties();
while (iter.hasNext()) {
DatatypeProperty prop = (DatatypeProperty) iter.next();
String propName = prop.getLocalName();
String dom = "";
String rng = "";
if(prop.getDomain()!=null)
dom = prop.getDomain().getLocalName();
if(prop.getRange()!=null)
rng = prop.getRange().getLocalName();
System.out.println(propName +": t("+dom+") t -> ("+rng+") ");
}
diplomaName:
studentNumber:
moduleName:
age:
personName:
email:
30/03/2010
(Diploma)
(Student)
(Module)
(Person)
(Person)
(Person)
-> (string)
-> (string)
-> (string)
-> (int)
-> (string)
-> (string)
output
21
22. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Object Properties
list all object properties in the model:
Iterator iter = model.listObjectProperties();
while (iter.hasNext()) {
ObjectProperty prop = (ObjectProperty) iter.next();
String propName = prop.getLocalName();
String dom = "";
String rng = "";
if(prop.getDomain()!=null)
dom = prop.getDomain().getLocalName();
if(prop.getRange()!=null)
rng = prop.getRange().getLocalName();
System.out.println(propName +": t("+dom+") t -> ("+rng+") ");
}
enrolledIn:
hasModule:
taughtBy:
teach:
(Student) -> (Diploma)
(Diploma) -> (Module)
(Module) -> (Professor)
(Professor) -> (Module)
getInverse()
30/03/2010
→
output
(OntProperty)
22
23. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Other Types of Properties
Using the same way, we may list (iterate) other properties:
model.listFunctionalProperties()
model.listInverseFunctionalProperties()
model.listSymmetricProperties()
model.listTransitiveProperties()
30/03/2010
23
24. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Restrictions
if(ontClass.isRestriction()){
Restriction rest = ontClass.asRestriction();
OntProperty onProperty = rest.getOnProperty();
...
}
30/03/2010
24
26. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
HasValue
if(rest.isHasValueRestriction()){
HasValueRestriction hvr = rest.asHasValueRestriction();
RDFNode hv = hvr.getHasValue();
...
}
30/03/2010
26
27. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Cardinality / MinCardinality / MaxCardinality
if(rest.isCardinalityRestriction()){
CardinalityRestriction cr = rest.asCardinalityRestriction();
int card = cr.getCardinality();
...
}
if(rest.isMinCardinalityRestriction()){
MinCardinalityRestriction mcr = rest.asMinCardinalityRestriction();
int minCard = minCR.getMinCardinality();
...
}
if(rest.isMaxCardinalityRestriction()){
MaxCardinalityRestriction mcr = rest.asMaxCardinalityRestriction();
int maxCard = maxCR.getMaxCardinality();
...
}
30/03/2010
27
28. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Individuals
list all individuals in the model
Iterator individuals = model.listIndividuals();
while (individuals.hasNext()) {
Individual individual = (Individual) individuals.next();
...
}
list individuals of a specific class
Iterator iter = ontClass.listInstances();
while (iter.hasNext()) {
Individual individual = (Individual) iter.next();
...
}
30/03/2010
28
29. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Individuals
list properties and property values of an individual
Iterator props = individual.listProperties();
while (props.hasNext()) {
Property property = (Property) props.next();
RDFNode value = individual.getPropertyValue(property);
...
}
list values of a specific property of an individual
Iterator values = individual.listPropertyValues(property);
while (values.hasNext()) {
RDFNode value = values.next();
...
}
30/03/2010
29
30. Reading an Existing Ontology
Classes
Creating a New Ontology
Properties
Individuales
Individuals
get the class to which an individual belongs
Resource rdfType = individual.getRDFType();
OntClass ontClass = model.getOntClass(rdfType.getURI());
in recent versions of Jena
OntClass ontClass = individual.getOntClass();
30/03/2010
30
31. Outline
What is Jena ?
Reading an Existing Ontology
Classes
Properties
Individuals
Creating a New Ontology
30/03/2010
Classes
Properties
Individuales
31
32. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Create the ontology model
OntModel model =
ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
String uriBase = "http://www.something.com/myontology";
model.createOntology(uriBase);
30/03/2010
32
33. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Create Classes
//create
OntClass
OntClass
OntClass
OntClass
OntClass
30/03/2010
classes
person = model.createClass(uriBase+"#Person");
module = model.createClass(uriBase+"#Module");
diploma = model.createClass(uriBase+"#Diploma");
student = model.createClass(uriBase+"#Student");
professor = model.createClass(uriBase+"#Professor");
33
34. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Set Sub-Classes
//set sub-classes
person.addSubClass(student);
person.addSubClass(professor);
30/03/2010
34
35. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Intersection / Union / Complement
RDFNode[] classes = new RDFNode[] {class1, class2, ...};
RDFList list = model.createList(classes);
IntersectionClass intersection =
model.createIntersectionClass(uri, list);
UnionClass union = model.createUnionClass(uri, list);
ComplementClass compl =
model.createComplementClass(uri, resource);
30/03/2010
35
36. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Create Datatype Properties
//create datatype properties
DatatypeProperty personName =
model.createDatatypeProperty(uriBase+"#personName");
personName.setDomain(person);
personName.setRange(XSD.xstring);
DatatypeProperty age = model.createDatatypeProperty(uriBase+"#age");
age.setDomain(person);
age.setRange(XSD.integer);
//
... ...
30/03/2010
36
38. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Inverse-of / Functional
set inverse properties
// set inverse properties
teach.setInverseOf(taughtBy);
set functional properties
// set functional properties
enrolledIn.setRDFType(OWL.FunctionalProperty);
30/03/2010
38
40. Creating a New Ontology
Reading an Existing Ontology
Classes
Properties
Individuales
Individuales
create an individual
Individual indv = ontClass.createIndividual(uri);
or
Individual indv = model.createIndividual(uri, ontClass);
set a property value of an individual
indv.setPropertyValue(property, rdfNode);
30/03/2010
40
41. Write Ontology Model
write the model to standard output
// write out the model
model.write(System.out,"RDF/XML-ABBREV");
save the model to a string
StringWriter sw = new StringWriter();
model.write(sw, "RDF/XML-ABBREV");
String owlCode = sw.toString();
30/03/2010
41
42. Save the Model to a File
File file = new File(filePath);
try{
FileWriter fw = new FileWriter(file);
fw.write(owlCode);
fw.close();
} catch(FileNotFoundException fnfe){
fnfe.printStackTrace();
} catch(IOException ioe){
ioe.printStackTrace();
}
30/03/2010
42