RDFSchema in end-user application: Which Java-API to use?

Scenario:

I have a given RDF Schema [2] and would like to programatically add
some statements to a model. The statements should be instances of the
classes and properties given in the schema. Imagine for example that I am writing a
FOAF-editor.

Later, I also want to query my model and prints
all friendship-relations like this:
    (person name) +" knows "+ (other person name)
Note that the end-user sees no URIs, just nice Strings. Example output
given in [4].

I used Jena 2.1 and came up with the code [3].

Questions to the community:
--------------------------
1. Is there a nicer way (shorter, more readdable) to do this in Jena?

2. Are there other Java-APIs that make this nicer (shorter, more
readable)? As I've never tried other APIs, I would be glad to see an example.

If you can send me other code-examples for the same data and schema
they will make a nice introduction to the other APIs: I will put them
all togehter on some webpage...

Thanks in advance,

  Max Völkel
--
University of Karlsruhe, AIFB, Knowledge Management Group
room #258, building 11.40
mvo@aifb.uni-karlsruhe.de   +49 721 608-4754   www.xam.de


- Code snippets ---


[1] Desired RDF output (N-TRIPLES format)
-------------------------------------------------
<data://p1> <schema://hasFriend> <data://p2> .
<data://p1> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "schema://Person" .
<data://p2> <schema://hasName> "York Sure" .
<data://p1> <schema://hasName> "Rudi Studer" .
<data://p2> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> "schema://Person" .
-------------------------------------------------



[2] Given RDF Schema  (N3)
-------------------------------------------------
@prefix rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix foaf: <http://rdfreactor.ontoware.org/2005/04/foaf#> .

foaf:Person a rdfs:Class.

foaf:hasName a rdf:Property
; rdfs:domain foaf:Person
; rdfs:range rdfs:Literal
.

foaf:knows a rdf:Property
; rdfs:domain foaf:Person
; rdfs:range foaf:Person
.
-------------------------------------------------

[2] Given RDF Schema (N-TRIPLES format)
-------------------------------------------------
<http://rdfreactor.ontoware.org/2005/04/foaf#hasName> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Property> .
<http://rdfreactor.ontoware.org/2005/04/foaf#knows> <http://www.w3.org/2000/01/rdf-schema#range> <http://rdfreactor.ontoware.org/2005/04/foaf#Person> .
<http://rdfreactor.ontoware.org/2005/04/foaf#knows> <http://www.w3.org/2000/01/rdf-schema#domain> <http://rdfreactor.ontoware.org/2005/04/foaf#Person> .
<http://rdfreactor.ontoware.org/2005/04/foaf#knows> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/1999/02/22-rdf-syntax-ns#Property> .
<http://rdfreactor.ontoware.org/2005/04/foaf#Person> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2000/01/rdf-schema#Class> .
<http://rdfreactor.ontoware.org/2005/04/foaf#hasName> <http://www.w3.org/2000/01/rdf-schema#range> <http://www.w3.org/2000/01/rdf-schema#Literal> .
<http://rdfreactor.ontoware.org/2005/04/foaf#hasName> <http://www.w3.org/2000/01/rdf-schema#domain> <http://rdfreactor.ontoware.org/2005/04/foaf#Person> .
-------------------------------------------------


[3] Source code in Jena
-------------------------------------------------
jenaDataModel = ModelFactory.createDefaultModel();

// create RDF [1] according to Schema [2]
Property name = jenaDataModel.createProperty("schema://hasName");
Property knows = jenaDataModel.createProperty("schema://hasFriend");

Resource p1 = jenaDataModel.createResource("data://p1");
Resource p2 = jenaDataModel.createResource("data://p2");
p1.addProperty( RDF.type, "schema://Person");
p2.addProperty( RDF.type, "schema://Person");

p1.addProperty(name, "Rudi Studer");
p2.addProperty(name, "York Sure");
p1.addProperty(knows, p2);

// query model and render output
StmtIterator it = p1.listProperties(knows);
while (it.hasNext()) {
   Statement s = it.nextStatement();
   System.out.println(s.getSubject().getProperty(name).getLiteral()
      .getLexicalForm()
      + " knows "
      + jenaDataModel.createResource(
          s.getObject().asNode().getURI()).getProperty(name)
          .getLiteral().getLexicalForm());

}
-------------------------------------------------

[4] Example output
-------------------
Rudi Studer knows York Sure
------------------

Received on Friday, 22 April 2005 09:34:09 UTC