Friday, February 06, 2009

SemWeb

Oggi voglio introdurvi, miei cari lettori, ad una mia ottima amica degli ultimi giorni: una libreria per lo sviluppo di network semantici. La libreria SemWeb è quanto di meglio offre il mondo open source nell'ambito delle reti semantiche per il framework .net. caratteristica estremamente interessante di questa libreria sta da un lato nella sua integrabilità con database "reali", dall'altro nella sua compatibilità con query N3 e SPARQL.
Vediamo un pò di fare un esempio semplice di network. Supponiamo di voler creare una rete semantica basata sulla mitica Facebook API (o per lo meno sui servizi REST). E supponiamo di voler organizzare in modo intelligente le informazioni per ottenere dati di marketing tali da permetterci di andare a valutare come posizionare un certo prodotto sul mercato in modo da sfruttare le caratteristiche virali di internet (si, ho sparato una sequenza di stupidate per giustificare l'uso di Facebook REST).
Partiamo dal definire le caratteristiche fondamentali di questo "gioco". Abbiamo degli utenti di facebook, i loro amici, le cose di cui sono fan, i gruppi a cui appartengono, le applicazioni che hanno installato. Date queste entità e fato il fatto che sono tutte accessibili tramite le API REST, diventa estremamente facile poter pensare al mondo facebook come insieme di triplette (entità1, relazione, entità2). In particolare avremo delle entità che potremo identificare tramite il loro indirizzo "personale" su facebook avendo facilmente l'URI di ognuna di esse. Le relazioni potremmo prenderle, effettivamente, da FOAF, ma per facilità di trattazione creiamo uno standard nostro, ad esempio "http://www.facebook.com/rel/isFriendOf".
Ora il gioco diventa semplcissimo. Ogni volta che invochiamo l'api trovando nuovi amici di un dato utente, aggiungiamo ad un MemoryStore uno statement contenente l'entità dell'utente che stiamo analizzando, il tipo di relazione "http://www.facebook.com/rel/isFriendOf" e l'entità dell'utente che abbiamo trovato come amico del primo. Questo per ogni tipo di relazione che andremo ad analizzare.
Fatto questo il MemoryStore conterrà un pò di relazioni fra utenti. Sarebbe estremamente interessante poter interrogare la raccolta di dati su relazioni particolari, come amici di schieramenti politici opposti. Per questo ci viene in aiuto SPARQL, che con un elegante sistema di codifica permette di andare a definire esattamente quella query (domani il codice di esempio della query).
Non ha senso dover rifare ogni volta l'albero (anche se magari persone si sono aggiunte o tolte). Per questo si può utilizzare l'ottimo RDFXmlWriter che trasforma la rete semantica definita nel memorystore in un file XML utilizzabile sia da Protege, che ovviamente dall'RDFXmlReader per ripartire da una rete già pronta...
Domani un pò di codice su cui pensare...

Di colli di bottiglia

ieri. ore 9.00: parte l'esecuzione dell'analizzatore del framework .net che genera la rete semantica.
ieri. ore 9.10: si conclude l'esecuzione con la creazione di un file XML delle dimensioni di 120MB. Sono circa 1500000 relazioni RDF.
oggi. ore 9.00: parte l'esecuzione dell'analizzatore del framework .net che genera la rete semantica.
oggi. ore 9.10: siamo a 10000 relazioni.
oggi. ore 12.00: siamo a 300000 relazioni.
oggi. ore 15.00: siamo a 550000 relazioni.
domani. ore 00.40: siamo a 1145723 relazioni.
domani. ore 01.15: si conclude l'esecuzione che ha riempito SQL Server 2008 con le relazioni gioiose e felici. Chissà se funzionano le query SPARQL...