Introduzione

Dopo aver parlato di RDF e RDFS (vedere [MOKASEMWEB1] e [MOKASEMWEB2]), di Ontologie e OWL (vedere [MOKASEMWEB3] concludiamo questa serie tecnica dedicata al Semantic Web presentando un esempio pratico. Lo scopo è realizzare un esempio di Portale semantico. L'idea di fondo è quella di arricchire semanticamente le informazioni alle quali accedere attraverso il portale, tale arricchimento permette di fatto una classificazione multidimensionale (faceted classification) delle informazioni con una conseguente navigazione delle informazioni più flessibile rispetto ai tradizionali sistemi di ricerca full-text (vedere[BMK_MC]).

SWAD-E Semantic Portal

L'esempio di Portale Semantico che verrà presentato è basato sul progetto Semantic Web Environmental Director (SWED).

Il Portale, realizzato per scopi puramente didattici, fornirà un subset delle funzionalità disponibili del ben più ricco portale Semantico Mokabyte [MOKA-SWP].

Figura 1 - Moka Semantic web Portal
Figura 1 - Moka Semantic web Portal

Il progetto SWED fa parte di un progetto finanziato dalla Comunità Europea, denominato SWAD-Europe (Semantic Web Advanced Development) ed è stato sviluppato presso i laboratori Hewlett Packard a Bristol e presso ILRT (Institute for Learning and Research Technology) dell'Università inglese di Bristol.

Un prototipo di portale è raggiungibile all'indirizzo http://www.swed.org.uk/swed/index.html e mostra come creare una directory di organizzazioni e progetti ambientali all'interno del Regno Unito.

Figura 2 - La pagina principale del portale d'esempio SWED
Figura 2 - La pagina principale del portale d'esempio SWED

Il progetto SWED comprende anche il software (scaricabile gratuitamente) dal sito [SWED-TR] che permette di creare il proprio portale personalizzato.

L'esempio "ambientalista" è costituito dalla Web App di nome 'portal' contenuta all'interno del portal.zip.

La sua installazione è facile e immediata: basta installare la directory della Web Application in

<<TOMCAT_HOME>>

\webapps.

La sua installazione è facile e immediata: basta installare la directory della Web Application in <<TOMCAT_HOME>>\webapps. Il controller dell'MVC è implementato con una Servlet (di nome Entry) che innesca l'azione corrispondente al valore del parametro HTTP action ed invoca l'opportuna vista (Velcocity template). Tutte le pagine del portale (View) vengono generate a partire da template Velocity (velocity-based template) Velocity è un template engine opensource (Jakarta), attraverso i suoi template (.vm =Velocity Macro) si accede agli oggetti java presenti nel suo contesto[VELOCITY]. Il Velocity template engine è responsabile dell'opportuno rendering di tali pagine per creare la vista del portale. Questo meccanismo agevola la personalizzazione del "look and feel" del portale come si parlerà in seguito. Il Model è costituito da una serie di classi Java come Facet, FacetState, FilterState e DataStore. L'idea core per le ricerche nel portale è dividere lo "spazio di ricerca" in un set di dimensioni chiamate facet. Ogni facet specifica alcune proprietà sulle quali effettuare le ricerche degli oggetti d'interesse. Queste possono essere semplici valori (es: lettera alfabetica) o ben piu' complesse classificazioni gerarchiche.

Per configurare i DataSource bisogna modificare il file

<<Portal>>

WEB-INF/config/sources.n3. Tale file RDF, scritto in sintassi N3, contiene le proprietà di confogurazione con prefisso pcv.

Per configurare i DataSource bisogna modificare il file <<Portal>>WEB-INF/config/sources.n3. Tale file RDF, scritto in sintassi N3, contiene le proprietà di confogurazione con prefisso pcv. public class MOKADIC {

/ <p>The ontology model that holds the vocabulary terms</p> / private static OntModel mmodel = ModelFactory.createOntologyModel(OntModelSpec.OWLMEM, null ); / <p>The namespace of the vocabulary as a string</p> / public static final String URI = "http://www.mokabyte.it/2007/09/moka/moka_owl#";

/** <p>The namespace of the vocabulary as a string</p> */ public static String getURI() { return URI; }

/** <p>The namespace of the vocabulary as a resource</p> */ public static final Resource NAMESPACE = m_model.createResource( URI );

/** <p>relation between Document class and Moka Classification Class</p> */ public static final ObjectProperty HASCLASSIFICATION = mmodel.createObjectProperty( URI + "has_classification" );

/** <p>relation between Document class and ProfessionalRole Class</p> */ public static final ObjectProperty HASSKILL = mmodel.createObjectProperty( URI + "has_skill" );

. . . // Classi della tassonomia classificazione articoli public static final OntClass MOKACLASSIFICATION = mmodel.createClass( URI + "MokaClassification" );

public static final OntClass JAVA = m_model.createClass( URI + "Java" );

public static final OntClass J2EE = m_model.createClass( URI + "J2EE" );

public static final OntClass INTEGRATION = m_model.createClass( URI + "Integration" );

public static final OntClass NEWTRENDS = mmodel.createClass( URI + "NewTrends" );

public static final OntClass J2ME = m_model.createClass( URI + "J2ME" );

public static final OntClass METHODOLOGY = m_model.createClass( URI + "Methodology" );

. . . // Classi della tassonomia classificazione skill articolisti public static final OntClass PROFESSIONALROLE = mmodel.createClass( URI + "ProfessionalRole" );

public static final OntClass ARCHITECT = m_model.createClass( URI + "Architect" );

public static final OntClass DEVELOPER = m_model.createClass( URI + "Developer" );

public static final OntClass PROJECTMANAGER = mmodel.createClass( URI + "ProjectManager" );

public static final OntClass WEBDESIGNER = mmodel.createClass( URI + "WebDesigner" );

}

public class CreateRdfForPortal {
private String CLASS_NAME = "CreateRdfForPortal";

private static final String FILE_NAME =

"C:/installed/apache-tomcat-5.5.23/webapps/KokPortal/data/kok/articles.rdf";

public static void main (String args[]) {

  new CreateRdfForPortal().makeRdf();

  }
public void makeRdf(){

  try{

// create an empty model
  Model model = ModelFactory.createDefaultModel();

  . . . . .

Resource articoloResource = model.createResource("http://www.mokabyte.it/Article1") .addProperty(RDF.type, MOKADIC.MOKABYTEARTICLE) .addProperty(RDFS.label, "Architetture di Integrazione(I)") .addProperty(RDFS.comment, "Articolo di Mokabyte (http://www.mokabyte.it)") // Moka tags .addProperty(MOKADIC.HASTITLE, "Architetture di Integrazione(I)") .addProperty(MOKADIC.HASAUTHOR,"S. Rossini") .addProperty(MOKADIC.HASDESCRIPTION, "Articolo Mokabyte") .addProperty(MOKADIC.HASARTICLEURL, "http://www2.mokabyte.it/cms/article.run?articleId= C8Q-6EC-UH5-JH67f00000174708135118d028") // Classificazione JavaClass (ontologia JavaCLASS) .addProperty(MOKADIC.HASCLASSIFICATION, MOKADIC.INTEGRATION) // Classificazione skill lettore .addProperty(MOKADIC.HAS_SKILL, MOKADIC.ARCHITECT);

articoloResource = model.createResource("http://www.mokabyte.it/Arcticle10")
			.addProperty(RDF.type, MOKADIC.MOKABYTE_ARTICLE)
			.addProperty(RDFS.label, "Networking in Java: RMI-la teoria")
			.addProperty(RDFS.comment, "Articolo di Mokabyte (http://www.mokabyte.it)")
// Moka tags
			.addProperty(MOKADIC.HAS_TITLE, "Networking in Java: RMI-la teoria")
			.addProperty(MOKADIC.HAS_AUTHOR,"S. Rossini")
			.addProperty(MOKADIC.HAS_DESCRIPTION, "Articolo Mokabyte")
			.addProperty(MOKADIC.HAS_ARTICLE_URL,
			"http://www.mokabyte.it/2000/07/reti5_teoria.htm")
// Classificazione JavaClass (ontologia JavaCLASS)
			.addProperty(MOKADIC.HAS_CLASSIFICATION, MOKADIC.JUMP_START)
// Classificazione skill lettore
			.addProperty(MOKADIC.HAS_SKILL, MOKADIC.DEVELOPER);
FileOutputStream fos = new FileOutputStream(FILE_NAME);

		model.write(fos);

http://www.swed.org.uk/swed/servlet/Entry?action=v