Download import org.apache.jena.rdf.model.Resource

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Knowledge Representation
XI – IKT437
Apache Jena
Part
II
OWL, SPARQL, …
Jan Pettersen Nytun, UiA
1
S
P
O
This presentation is based on:
Jena Ontology API
http://jena.apache.org/documentation/ontology/
Jan Pettersen Nytun, UIA, page 2
… Jena is fundamentally an RDF platform,
… limited to ontology formalisms built on
top of RDF.
… this means RDFS, the varieties of OWL.
3
The OWL language is sub-divided
into three syntax classes:
OWL Lite, OWL DL and OWL Full.
[Wikipedia]:
• Every legal OWL Lite ontology is a legal
OWL DL ontology.
• Every legal OWL DL ontology is a legal
OWL Full ontology.
4
[Wikipedia]:
OWL Lite was originally intended to
support those users primarily needing a
classification hierarchy and simple
constraints …
Development of OWL Lite tools has …
proven almost as difficult as development
of tools for OWL DL, and OWL Lite is not
widely used.
5
[Wikipedia]:
OWL DL is designed to provide the maximum
expressiveness possible while retaining
computational completeness, decidability, and
the availability of practical reasoning algorithms.
OWL DL includes all OWL language constructs,
but they can be used only under certain
restrictions …
6
S
P
O
Completeness
[Wikipedia]:
In mathematical logic, a theory is complete if it
is a maximal consistent set of sentences, i.e., if
it is consistent, and none of its proper
extensions is consistent. For theories in logics
which contain classical propositional logic, this
is equivalent to asking that for every sentence φ
in the language of the theory it contains either φ
itself or its negation ¬φ.
Jan Pettersen Nytun, UIA, page 7
S
P
O
Gödel's incompleteness theorem
[Wikipedia]:
Recursively axiomatizable first-order theories
that are rich enough to allow general
mathematical reasoning to be formulated
cannot be complete, as demonstrated
by Gödel's incompleteness theorem.
… For any such system, there will always be
statements about the natural numbers that are
true, but that are unprovable within the system.
Jan Pettersen Nytun, UIA, page 8
S
P
O
Decidability
[Wikipedia]:
The logically valid formulas of a system are
sometimes called the theorems of the system, …
A logical system is decidable if there is an
effective method for determining whether
arbitrary formulas are theorems of the logical
system.
Jan Pettersen Nytun, UIA, page 9
[Wikipedia]:
OWL Full[edit] … a class can be treated
simultaneously as a collection of
individuals and as an individual in its own
right ... OWL Full allows an ontology to
augment the meaning of the pre-defined
(RDF or OWL) vocabulary.
OWL Full is undecidable, so no reasoning
software is able to perform complete
reasoning for it.
10
S
P
O
The Jena Ontology API is
language-neutral
• The Java class names are not specific to the
underlying language. For example, the
OntClass Java class can represent an OWL
class or RDFS class.
• To represent the differences between the
various representations, each of the ontology
languages has a profile, which lists the
permitted constructs and the names of the
classes and properties.
Jan Pettersen Nytun, UIA, page 11
S
P
O
The Profile
• The profile is bound to an ontology model, which
is an extended version of Jena's Model class.
• The base Model allows access to the statements
in a collection of RDF data.
• OntModel extends this by adding support for the
kinds of constructs expected to be in an ontology:
classes (in a class hierarchy), properties (in a
property hierarchy) and individuals.
Jan Pettersen Nytun, UIA, page 12
S
P
O
The Profile Continues …
• The ontology API doesn't change the RDF
representation of ontologies.
• It adds a set of convenience classes and
methods that make it easier for you to write
programs that manipulate the underlying RDF
triples.
Jan Pettersen Nytun, UIA, page 13
S
P
O
OntClass
• The predicate names defined in the ontology language
correspond to the accessor methods on the Java
classes in the API. For example, an OntClass has a
method to list its super-classes, which corresponds to
the values of the subClassOf property in the RDF
representation.
• This point is worth re-emphasizing: no information is
stored in the OntClass object itself. When you call the
OntClass listSuperClasses() method, Jena will retrieve
the information from the underlying RDF triples.
Similarly, adding a subclass to an OntClass asserts an
additional RDF triple, typically with predicate
rdfs:subClassOf into the model.
Jan Pettersen Nytun, UIA, page 14
S
P
O
Jena Graph Interface
Graph is an internal Jena
interface that supports the
composition of sets of RDF
triples.
The asserted statements,
which may have been read
in from an ontology
document, are held in the
base graph.
Jan Pettersen Nytun, UIA, page 15
S
P
O
The reasoner, or inference
engine, can use the contents
of the base graph and the
semantic rules of the language
to show a more complete set
of base and entailed triples.
This is also presented via a
Graph interface, so the
OntModel works only with the
outermost interface.
Jan Pettersen Nytun, UIA, page 16
S
P
O
The base graph can be an inmemory store, a databasebacked persistent store, or
some other storage
structure altogether …
Jan Pettersen Nytun, UIA, page 17
S
P
O
RDF-level polymorphism and Java
At the same time the following may be “true”
(Restriction is a subclass of Class) :
page 18
S
P
O
RDF-level polymorphism and Java Continues …
The problem we then have is that Java does not allow us
to dynamically change the Java class of the object
representing this resource.
Jena accepts this basic characteristic of polymorphism at
the RDF level by considering that the Java abstraction
(OntClass, Restriction, DatatypeProperty, etc.) is just a
view or facet of the resource.
If the resource is typed as an owl:Class, it can present the
OntClass facet; given other types, it can present other
facets. Jena provides the .as() method to efficiently map
from an RDF object to one of its allowable facets.
page 19
S
P
O
RDF-level polymorphism and Java Continues …
Resource r = myModel.getResource( myNS + "DigitalCamera" );
OntClass cls = r.as( OntClass.class );
If a given RDFNode will not support the conversion to a given
facet, it will raise a ConversionException.
We can test whether .as() will succeed for a given facet with
canAs().
page 20
S
P
O
Creating Ontology Models
OntModel m = ModelFactory.createOntologyModel();
This will create an ontology model with the
default settings:
• OWL-Full language
• in-memory storage
• RDFS inference, which principally produces
entailments from the sub-class and subproperty hierarchies.
Jan Pettersen Nytun, UIA, page 21
S
P
O
In many applications, such as driving a GUI,
RDFS inference is too strong.
An OWL model that performs no reasoning at all
can be created with:
OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
Jan Pettersen Nytun, UIA, page 22
S
P
O
Jan Pettersen Nytun, UIA, page 23
Testing Reasoning in Jena
S
P
O
Input Ontology
@prefix : <http://www.uia.no/janpettersennytun/inference#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
:hasApprovedId
:hasSomeId
:hasHusband
:hasWife
a
a
a
a
owl:DatatypeProperty ; rdfs:subPropertyOf :hasSomeId .
owl:DatatypeProperty .
owl:ObjectProperty ; owl:inverseOf :hasWife .
owl:ObjectProperty .
:Man
a owl:Class ;
:Woman a owl:Class ;
:Human a owl:Class .
rdfs:subClassOf :Human .
rdfs:subClassOf :Human .
:Homer a owl:NamedIndividual , :Man ;
:hasSomeId "Homer_ID1_SomeID" .
:Marge a owl:NamedIndividual , :Woman ; :hasApprovedId "Marge_ID1_Approved" ;
:hasHusband :Homer .
Jan Pettersen Nytun, UIA, page 24
S
P
O
Testing Reasoning in Jena
Application Heading
package testreasoners;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.jena.ontology.OntModel;
import org.apache.jena.ontology.OntModelSpec;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.util.FileManager;
Jan Pettersen Nytun, UIA, page 25
S
O
P
Testing Reasoning in Jena
Method Overview
public class TestReasoners {
private static String inputFileName = "InferenceTest__InputFile.ttl";
private static String outputFileName = "InferenceTest__OutputFile.ttl";
public static void main(String[] args){ … }
public static List<String> getSortedTriples(Model model){ … }
public static OntModel readFile(OntModelSpec ontModelSpec){ … }
}
Jan Pettersen Nytun, UIA, page 26
S
O
P
Testing Reasoning in Jena
readFile - Method
public static OntModel readFile(OntModelSpec ontModelSpec){
OntModel ontModel = ModelFactory.createOntologyModel(ontModelSpec);
InputStream in = FileManager.get().open( inputFileName );
if (in == null) {
System.out.println("File: " + inputFileName + " not found");
System.exit(1);
}
// read the Turtle file
ontModel.read(in, null, "Turtle");
//ontModel.write(System.out, "Turtle");
return ontModel;
}
Jan Pettersen Nytun, UIA, page 27
Testing Reasoning in Jena
S
P
O
getSortedTriples- Method
public static List<String> getSortedTriples(Model model){
List<String> triples = new ArrayList<String>();
StmtIterator iter = model.listStatements();
String format = "%-20s";
String defaultNamespace = model.getNsPrefixMap().get("");
if (defaultNamespace == null) return triples;
Jan Pettersen Nytun, UIA, page 28
while (iter.hasNext()) {
Statement stmt = iter.nextStatement(); // get next statement
Resource subject = stmt.getSubject(); // get the subject
String namespace = subject.getNameSpace();
if (namespace == null || !namespace.equals(defaultNamespace)) continue;
Property predicate = stmt.getPredicate(); // get the predicate
RDFNode object = stmt.getObject(); // get the object
String tripleAsString = String.format(format, subject.getLocalName().toString());
tripleAsString = tripleAsString + String.format(format, predicate.getLocalName().toString());
if (object instanceof Resource) {
tripleAsString = tripleAsString + object.asResource().getLocalName().toString() + " .";
} else { // object is a literal
tripleAsString = tripleAsString + " \"" + object.toString() + "\"" + " .";
}
triples.add(tripleAsString);
}
Collections.sort(triples); return triples; }
Jan Pettersen Nytun, UIA, page 29
S
P
O
public static void main(String[] args){
OntModel model_OWL_DL_MEM = readFile(OntModelSpec.OWL_DL_MEM);
List<String> triples_OWL_DL_MEM = getSortedTriples(model_OWL_DL_MEM);
System.out.println("Triple found in model_OWL_DL_MEM");
System.out.println(".............................................................................");
for (String oneTriple : triples_OWL_DL_MEM) System.out.println(oneTriple);
System.out.println(".............................................................................\n");
model_OWL_DL_MEM.close();
…
Jan Pettersen Nytun, UIA, page 30
Triple found in model_OWL_DL_MEM
................................................................
Homer
hasSomeId
"Homer_ID1_SomeID" .
Homer
type
Man .
Homer
type
NamedIndividual .
Human
type
Class .
Man
subClassOf
Human .
Man
type
Class .
Marge
hasApprovedId
"Marge_ID1_Approved" .
Marge
hasHusband
Homer .
Marge
type
NamedIndividual .
Marge
type
Woman .
Woman
subClassOf
Human .
Woman
type
Class .
hasApprovedId
subPropertyOf
hasSomeId .
hasApprovedId
type
DatatypeProperty .
hasHusband
inverseOf
hasWife .
hasHusband
type
ObjectProperty .
hasSomeId
type
DatatypeProperty .
hasWife
type
ObjectProperty .
................................................................
OntModel model_OWL_DL_MEM_RDFS_INF =
readFile(OntModelSpec.OWL_DL_MEM_RDFS_INF);
List<String> triples_OWL_DL_MEM_RDFS_INF =
getSortedTriples(model_OWL_DL_MEM_RDFS_INF);
System.out.println("Triple found in model_OWL_DL_MEM_RDFS_INF");
System.out.println(".............................................................................");
for (String oneTriple : triples_OWL_DL_MEM_RDFS_INF) {
System.out.println(oneTriple);
}
System.out.println(".............................................................................\n");
model_OWL_DL_MEM_RDFS_INF.close();
Jan Pettersen Nytun, UIA, page 32
Triple found in model_OWL_DL_MEM_RDFS_INF
.................................................................
Homer
hasSomeId
"Homer_ID1_SomeID" .
Homer
type
Human .
Homer
type
Man .
Homer
type
NamedIndividual .
Human
subClassOf
Human .
Human
type
Class .
Human
type
Class .
Human
type
Resource .
Man
subClassOf
Human .
Man
subClassOf
Man .
Man
type
Class .
Man
type
Class .
Man
type
Resource .
Marge
hasApprovedId
"Marge_ID1_Approved" .
Marge
hasHusband
Homer .
Marge
hasSomeId
"Marge_ID1_Approved" .
Marge
type
Human .
Marge
type
NamedIndividual .
Marge
type
Woman .
Woman
subClassOf
Human .
Woman
subClassOf
Woman .
Woman
type
Class .
Woman
type
Class .
Woman
type
Resource .
hasApprovedId
subPropertyOf
hasApprovedId .
hasApprovedId
subPropertyOf
hasSomeId .
hasApprovedId
type
DatatypeProperty .
hasApprovedId
type
Property .
hasApprovedId
type
Resource .
hasHusband
inverseOf
hasWife .
hasHusband
type
ObjectProperty .
hasSomeId
subPropertyOf
hasSomeId .
hasSomeId
type
DatatypeProperty .
hasSomeId
type
Property .
hasSomeId
type
Resource .
hasWife
type
ObjectProperty .
.........................................................
Jan Pettersen Nytun, UIA, page 34
OntModel model_OWL_DL_MEM_RULE_INF =
readFile(OntModelSpec.OWL_DL_MEM_RULE_INF);
List<String> triples_OWL_DL_MEM_RULE_INF =
getSortedTriples(model_OWL_DL_MEM_RULE_INF);
System.out.println("Triple found in model_OWL_DL_MEM_RULE_INF");
System.out.println(".............................................................................");
for (String oneTriple : triples_OWL_DL_MEM_RULE_INF) System.out.println(oneTriple);
System.out.println(".............................................................................\n");
try {
OutputStream outFile = new FileOutputStream(outputFileName);
model_OWL_DL_MEM_RULE_INF.write(outFile,"Turtle");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
model_OWL_DL_MEM_RULE_INF.close();
}
Jan Pettersen Nytun, UIA, page 35
Triple found in model_OWL_DL_MEM_RULE_INF
....................................................
Homer
hasSomeId
"Homer_ID1_SomeID" .
Homer
hasWife
Marge .
Homer
sameAs
Homer .
Homer
type
Human .
Homer
type
Man .
Homer
type
NamedIndividual .
Homer
type
Resource .
Homer
type
Thing .
Human
equivalentClass
Human .
Human
subClassOf
Human .
Human
subClassOf
Resource .
Human
subClassOf
Thing .
Human
type
Class .
Human
type
Class .
Human
type
Resource .
Jan Pettersen Nytun, UIA, page 36
Man
Man
Man
Man
Man
Man
Man
Man
Marge
Marge
Marge
Marge
Marge
Marge
Marge
Marge
Marge
equivalentClass
subClassOf
subClassOf
subClassOf
subClassOf
type
type
type
hasApprovedId
hasHusband
hasSomeId
sameAs
type
type
type
type
type
Man .
Human .
Man .
Resource .
Thing .
Class .
Class .
Resource .
"Marge_ID1_Approved" .
Homer .
"Marge_ID1_Approved" .
Marge .
Human .
NamedIndividual .
Resource .
Thing .
Woman .
Jan Pettersen Nytun, UIA, page 37
Woman
Woman
Woman
Woman
Woman
Woman
Woman
Woman
hasApprovedId
hasApprovedId
hasApprovedId
hasApprovedId
hasApprovedId
equivalentClass
subClassOf
subClassOf
subClassOf
subClassOf
type
type
type
subPropertyOf
subPropertyOf
type
type
type
Woman .
Human .
Resource .
Thing .
Woman .
Class .
Class .
Resource .
hasApprovedId .
hasSomeId .
DatatypeProperty .
Property .
Resource .
Jan Pettersen Nytun, UIA, page 38
hasHusband
hasHusband
hasHusband
hasHusband
hasHusband
hasHusband
hasHusband
hasHusband
hasHusband
hasSomeId
hasSomeId
hasSomeId
hasSomeId
domain
domain
inverseOf
range
range
subPropertyOf
type
type
type
subPropertyOf
type
type
type
Resource .
Thing .
hasWife .
Resource .
Thing .
hasHusband .
ObjectProperty .
Property .
Resource .
hasSomeId .
DatatypeProperty .
Property .
Resource .
Jan Pettersen Nytun, UIA, page 39
hasWife
domain
Resource .
hasWife
domain
Thing .
hasWife
inverseOf
hasHusband .
hasWife
range
Resource .
hasWife
range
Thing .
hasWife
subPropertyOf
hasWife .
hasWife
type
ObjectProperty .
hasWife
type
Property .
hasWife
type
Resource .
...................................................
Jan Pettersen Nytun, UIA, page 40