<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-34306098</id><updated>2012-02-02T16:42:18.823-03:00</updated><category term='RequestFactory'/><category term='Activity'/><category term='GWT'/><category term='Model View Presenter'/><category term='Google Web Toolkit'/><category term='Place'/><category term='Inauguración'/><title type='text'>The @power of #{this.code}</title><subtitle type='html'>Un lugar donde encontrar información sobre Java, C#, metodologías de diseño, arquitectura de sistemas, sistemas basados en conocimiento, otologías, firmado digital, etc.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>7</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-34306098.post-6236490824030322829</id><published>2011-10-11T14:42:00.001-03:00</published><updated>2011-10-11T14:42:39.139-03:00</updated><title type='text'>Dart - El nuevo lenguaje de Google</title><content type='html'>Google a dado a conocer su nuevo lenguaje de programación, &lt;b&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;Dart"&lt;/span&gt;&lt;/b&gt;.&lt;br /&gt;Éste, tiene como objetivo el desarrollo de aplicaciones para la Web. Los cimientos sobre los que fue construido están basados en los siguientes puntos:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crear un flexible pero estructurado lenguaje de programación para la Web.&lt;/li&gt;&lt;li&gt;Lograr que dar sea natural y familiar para los programados, que sea fácil de aprender.&lt;/li&gt;&lt;li&gt;Asegurar una performance a alta en todos los navegadores Web y distintos entornos desde dispositivos móviles hasta ejecución del lado del servidor.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;A continuación, el link del anuncio en el &lt;i&gt;Blog oficial de Google&amp;nbsp;Code&lt;/i&gt; y el &lt;i&gt;sitio &amp;nbsp;oficial&lt;/i&gt; del Lenguaje para que se animen a probar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://googlecode.blogspot.com/2011/10/dart-language-for-structured-web.html"&gt;Anuncio en el Blog de Google Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dartlang.org/"&gt;El sitio oficial de Dart&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-6236490824030322829?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/6236490824030322829/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=6236490824030322829' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/6236490824030322829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/6236490824030322829'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2011/10/dart-el-nuevo-lenguaje-de-google.html' title='Dart - El nuevo lenguaje de Google'/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-7543878163418830728</id><published>2011-09-08T14:53:00.006-03:00</published><updated>2011-09-08T16:03:50.364-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RequestFactory'/><category scheme='http://www.blogger.com/atom/ns#' term='GWT'/><category scheme='http://www.blogger.com/atom/ns#' term='Activity'/><category scheme='http://www.blogger.com/atom/ns#' term='Model View Presenter'/><category scheme='http://www.blogger.com/atom/ns#' term='Place'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Web Toolkit'/><title type='text'>¿Qué es GWT?</title><content type='html'>Después de un tiempo considerable sin escribir en el Blog, he vuelto para darle un poco mas vida a este espacio.&lt;br /&gt;El tema que me trae a colación es &lt;span style="font-weight:bold;"&gt;&lt;a href="http://code.google.com/intl/en-EN/webtoolkit/"&gt;GWT&lt;/a&gt;&lt;/span&gt; o también conocido como &lt;span style="font-weight:bold;"&gt;&lt;a href="http://code.google.com/intl/en-EN/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt;&lt;/span&gt;. &lt;br /&gt;GWT es un framework desarrollado por Google y con un gran aporte de la comunidad, nació por el año 2006 y hoy se encuentra muy estable y robusto en la versión 2.4.&lt;br /&gt;Todo aquel que ha desarrollado sistemas web seguramente a lideado con un montón de tecnologías, por ejemplo: &lt;span style="font-style:italic;"&gt;Javascript, HTML, CSS en la construcción de sus aplicaciones AJAX&lt;/span&gt;. Además, todos hemos sufrido el gran problema de lograr &lt;span style="font-weight:bold;"&gt;compatibilidad&lt;/span&gt; entre los navegadores.&lt;br /&gt;GWT es un plataforma que tiene la capacidad de lograr aplicaciones AJAX compatibles con todos los navegadores del mercado incluyendo móviles y el lenguaje de programación que utilizaremos será JAVA.&lt;br /&gt;Parece confuso, pero la premisa es sencilla, programamos en Java y el framework nos genera nuestra aplicación en javascript.&lt;br /&gt;&lt;br /&gt;Para lograr esto, la plataforma en su arquitectura tiene que contemplar la emulación de la JRE, es obvio que no toda la JRE debe ser emulada porque nuestro target es restringido, recordemos que nuestra aplicación resultante se ejecutará en un navegador web.&lt;br /&gt;A continuación les dejo un enlace con descripción de la referencia de la emulación de la JRE: &lt;a href="http://code.google.com/intl/es-419/webtoolkit/doc/1.6/RefJreEmulation.html"&gt;http://code.google.com/intl/es-419/webtoolkit/doc/1.6/RefJreEmulation.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otro de los componentes importantes es el &lt;span style="font-weight:bold;"&gt;compilador&lt;/span&gt;, éste es el que hace realmente la magia, toma como entrada nuestro código escrito en Java y genera una salida ofuscada de javascript por cada navegador y si queremos soportar internacionalización se generará una salida por cada idioma soportado y por cada navegador. Cabe destacar que no todo el código es compilado, solo la parte de nuestra aplicación que pretendemos correr en el cliente. Esto es configurable a través de módulos en los proyectos de GWT. &lt;br /&gt;&lt;br /&gt;GWT cuenta con un conjunto de APIs que nos permiten la creación de nuestras interfaces gráficas, comunicación con el servidor mediante JSON, XML y un protocolo propio de GWT denominado RPC, soporte de internacionalización, gestión del historial, implementación de patrones como Model View Presenter, soporte para lograr Data binding mediante un framework llamado Editor y mucho más.&lt;br /&gt;&lt;br /&gt;La pregunta que ustedes se pueden hacer mientras están leyendo es: &lt;span style="font-style:italic;"&gt;¿Porqué tener que usar GWT, si yo con JavaScript lo puedo hacer?&lt;/span&gt; La respuesta viene de la mano de la optimización y de la productividad. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Optimización&lt;/span&gt; es porque el compilador de GWT generará una salida optimizada para cada navegador lo que nos permitirá lograr lo que se denomina &lt;span style="font-weight:bold;"&gt;perfect caching&lt;/span&gt;, además de que los recursos están totalmente optimizados, por ejemplo, empleando el uso de la técnica de sprites en las imágenes.&lt;br /&gt;&lt;br /&gt;La productividad esta enfocada en el uso de un lenguaje fuertemente tipado. Cuando desarrollamos en javascript, un gran porcentaje de errores vienen de la mano de errores ortográficos y posiblemente de distracción. Estos errores solo son descubiertos en tiempo de ejecución por la misma naturaleza del lenguaje. En Java esto no pasa, todos nuestros errores serán descubiertos en tiempo de compilación, y al usar un IDE como eclipse o netbeans, el mismo IDE nos indica que estamos cometiendo un error, por ejemplo en alguna asignación de variable.&lt;br /&gt;&lt;br /&gt;Como el tiempo de compilación en GWT es grande, la plataforma provee dos modos de ejecución: &lt;span style="font-weight:bold;"&gt;Development Mode&lt;/span&gt; y &lt;span style="font-weight:bold;"&gt;Production Mode&lt;/span&gt;.&lt;br /&gt;El primero, será el modo en el que estaremos la mayor parte del tiempo, en este modo no necesitamos compilar, nuestra aplicación correrá sobre la JVM, eso quiere decir que el código a ejecutar será bytecode. Esto nos ahorra mucho tiempo, porque ante cada cambio en el código del cliente solo debemos precionar F5 en el navegador para visualizarlos.&lt;br /&gt;&lt;br /&gt;En Development Mode la plataforma se comunica con los navegadores mediante una conexión TCP, lo único que se impone es que el navegador debe tener un plugin para lograr correr nuestra app en este modo.&lt;br /&gt;&lt;br /&gt;La productividad también está garantizada por la velocidad de desarrollo; ¿Alguna vez imaginaron hacer un debug en javascript? Con gwt se puede hacer un debug de toda la aplicación, controlar las variables, sus estados, etc. &lt;br /&gt;Otra ventaja sobre aplicaciones nativas en javascript, es la posibilidad de realizar unidades de test de nuestro código. Esto, sumado a lo anterior mencionado logra agilizar nuestro ciclo de desarrollo.&lt;br /&gt;&lt;br /&gt;Production Mode es el modo en el cual correra nuestra aplicación en producción. Para esto es necesario compilarla, lo que generará los archivos necesarios para que esta pueda ser desplegada.&lt;br /&gt;&lt;br /&gt;El mundo de GWT es muy grande para comentarlo solo en un post, pero la idea es que sepan que esta tecnología es impulsada por Google, tiene detrás una gran comunidad de usuarios y desarrolladores contribuyendo y que hoy en su versión 2.4 está capacitada para dar solución a desarrollos a gran escala y aplicaciones empresariales.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hasta la próxima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-7543878163418830728?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='text/html' href='http://code.google.com/intl/en-EN/webtoolkit/doc/latest/DevGuide.html' length='0'/><link rel='enclosure' type='' href='http://www.logikas.com?page2' length='0'/><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/7543878163418830728/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=7543878163418830728' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/7543878163418830728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/7543878163418830728'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2011/09/que-es-gwt.html' title='¿Qué es GWT?'/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total><georss:featurename>Santa Fe, Argentina</georss:featurename><georss:point>-31.6323891 -60.6994591</georss:point><georss:box>-31.645908600000002 -60.7192001 -31.6188696 -60.679718099999995</georss:box></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-5655799788699648093</id><published>2009-01-21T18:38:00.000-02:00</published><updated>2009-01-21T07:57:18.795-02:00</updated><title type='text'>Frameworks y ontologías (Parte 2)</title><content type='html'>Hace ya un tiempo que no me sentaba a escribir en el blog, la verdad que por motivos de tiempo, trabajo, etc. Pero era hora de que cumpla con lo prometido y termine la segunda entrega del tutorial de Ontologías, sin más preambulos aqui les va ... &lt;br /&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;Frameworks y Ontologías (Parte 2)&lt;/b&gt;&lt;br&gt;&lt;br&gt;En la &lt;a href="http://www.juglar.org/index.php?topic=247.0" target="_blank"&gt;Parte 1&lt;/a&gt; de este tutorial sobre tecnologías circundantes al desarrollo de aplicaciones basadas en Ontologías introdujimos una serie pequeña de conceptos teóricos sobre los distintos lenguajes que existen en el mercado actual, ejemplos de éstos son: &lt;b&gt;RDF, RDF Schema, OWL Lite, OWL DL&lt;/b&gt; y por último &lt;b&gt;OWL Full&lt;/b&gt;. Mencionamos las distintas herramientas que existen para la manipulación de éstos lenguajes: &lt;b&gt;Jena, Pellet, OWL - API, etc.&lt;/b&gt;&lt;br&gt;Comenzamos con una Introducción a Jena, uno de los frameworks más utilizados, y listamos el conjunto de APIs que lo conforman.&lt;br&gt;Mencionamos como trata el polimorfismo en Java, y describimos algunos conceptos básicos del funcionamiento del framework.&lt;br&gt;En esta segunda parte seguiremos explorando Jena y como trata los modelos, nos centraremos en algunos ejemplos sencillos.&lt;br&gt;Veremos cómo poder cargar nuestras ontologías, como cargar modelos, como asociar uno u otro razonador, como persistir un modelo de ontologías y como cargarlo desde la base de datos.&lt;br&gt;&lt;br&gt;Comenzaremos con lo básico, supongamos que contamos con nuestra ontología la cual está guardada en nuestro disco rígido en formato owl y queremos poder manipularla, ¿cómo hacemos?&lt;br&gt;Para dar respuesta a esto en primer lugar debemos contar con un entorno de desarrollo, en particular utilizo Netbeans para el desarrollo en java y el jdk 1.6.&lt;br&gt;Creamos un proyecto en el IDE, bajamos las librerías de Jena (en el caso que no las tengamos) y las adherimos al proyecto.&lt;br&gt;&lt;br&gt;Para nuestro simple ejemplo vamos a definir la clase OntLoader de la siguiente manera:&lt;br&gt;&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (java):&lt;/div&gt;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; OntLoader &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AFile+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;File&lt;/span&gt;&lt;/a&gt; file = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;private&lt;/span&gt; OntModel model = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;public&lt;/span&gt; OntLoader&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AFile+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;File&lt;/span&gt;&lt;/a&gt; file&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp;java.&lt;span style="color: rgb(0, 102, 0);"&gt;io&lt;/span&gt;.&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AInputStream+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;InputStream&lt;/span&gt;&lt;/a&gt; input = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;this&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;file&lt;/span&gt; = file;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//Creación del modelo, que contendrá la representación de la ontología&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;model = ModelFactory.&lt;span style="color: rgb(0, 102, 0);"&gt;createOntologyModel&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;OntModelSpec.&lt;span style="color: rgb(0, 102, 0);"&gt;OWL_DL_MEM&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//Este input es la ontología en formato owl&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AFileInputStream+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;FileInputStream&lt;/span&gt;&lt;/a&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;file&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//Carga del modelo con la ontología en el input&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;model.&lt;span style="color: rgb(0, 102, 0);"&gt;read&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;input, &lt;span style="color: rgb(255, 0, 0);"&gt;""&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AFileNotFoundException+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;FileNotFoundException&lt;/span&gt;&lt;/a&gt; ex&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger.&lt;span style="color: rgb(0, 102, 0);"&gt;getLogger&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"global"&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;log&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Level.&lt;span style="color: rgb(0, 102, 0);"&gt;SEVERE&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;, ex&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;finally&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;try&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;input.&lt;span style="color: rgb(0, 102, 0);"&gt;close&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt; &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AIOException+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;IOException&lt;/span&gt;&lt;/a&gt; ex&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Logger.&lt;span style="color: rgb(0, 102, 0);"&gt;getLogger&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"global"&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;log&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;Level.&lt;span style="color: rgb(0, 102, 0);"&gt;SEVERE&lt;/span&gt;, &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;null&lt;/span&gt;, ex&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br&gt; &amp;nbsp; &amp;nbsp;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;&lt;br&gt;El código anterior muestra de manera sencilla la carga de una ontología en un modelo Jena, en el constructor de la clase nos llega un objeto de la clase File, el cual representa nuestro archivo owl.&lt;br&gt;&lt;br&gt;La siguiente línea &lt;span style="color: red;"&gt;model = ModelFactory.createOntologyModel( OntModelSpec.OWL_DL_MEM )&lt;/span&gt; significa que se va a crear un modelo en &lt;b&gt;memoria&lt;/b&gt; y basado en &lt;b&gt;OWL-DL&lt;/b&gt;.&lt;br&gt;Si la linea hubiese sido &lt;span style="color: red;"&gt;model = ModelFactory.createOntologyModel()&lt;/span&gt;, el modelo se creara con la configuración por defecto que se lista a continuación:&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; * Lenguaje OWL-FULL&lt;br&gt;&amp;nbsp; &amp;nbsp; * Almacenaje en Memoria&lt;br&gt;&amp;nbsp; &amp;nbsp; * Inferencia basada en RDF – Schema &lt;br&gt;&lt;br&gt;Existen algunas variantes para la creación de nuestro modelo dependiendo del tipo de raciocinio o el perfil del lenguaje que necesitemos. Esto puede ser especificado utilizando constantes definidas en la clase &lt;b&gt;OntModelSpec&lt;/b&gt;, las cuales definen ciertas configuraciones pre-establecidas haciendo un wrapper, de las URIs que representan los lenguajes (buscados en la clase &lt;b&gt;ProfileRegister&lt;/b&gt;), el tipo de almacenamiento y el razonador. Si precisamos una configuración propia, podemos crear una instancia de &lt;b&gt;OntModelSpec &lt;/b&gt;y a través de setters establecer los valores apropiados.&lt;br&gt;&lt;br&gt;Pero hasta el momento no tenemos nuestra ontología cargada, es el método &lt;b&gt;read()&lt;/b&gt; el que se encarga de esta tarea, como lo demarca la siguiente línea &lt;span style="color: red;"&gt;model.read(input, "")&lt;/span&gt;;&lt;br&gt;Existen algunas variantes del método read() que a continuación se enumeran:&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( String url )&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( Reader reader, String base )&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( InputStream reader, String base )&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( String url, String lang )&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( Reader reader, String base, String Lang )&lt;br&gt;&amp;nbsp; &amp;nbsp; * read( InputStream reader, String base, String Lang ) &lt;br&gt;&lt;br&gt;Cuando cargamos nuestro documento en el modelo, por defecto se cargan todos los import que nuestra ontología realiza. Es decir todo import que se realice sera cargado como un sub-modelo del modelo que se esta construyendo. Este import es recursivo, pero existe un chequeo para evitar ciclos.&lt;br&gt;Cada modelo tiene asociado un &lt;b&gt;Document Manager&lt;/b&gt; que es el encargado de manejar todos los documentos relacionados, por conveniencia existe un Document Manager global que es compartido por todos los modelos y es accesible a través de &lt;span style="color: red;"&gt;OntDocumentManager.getInstance()&lt;/span&gt;. Para muchos casos, cambiando las configuraciones generales mencionadas anteriormente es suficiente, pero para casos específicos uno puede crear un Document Manager particular y setearlo a la instancia de OntModelSpec que será pasada al Factory que nos creará el modelo.&lt;br&gt;&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (java):&lt;/div&gt;OntDocumentManager mgr = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; OntDocumentManager&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;// ...... codigo de usuario .......&lt;/span&gt;&lt;br&gt;OntModelSpec s = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; OntModelSpec&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; OntModelSpec.&lt;span style="color: rgb(0, 102, 0);"&gt;RDFS_MEM&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;s.&lt;span style="color: rgb(0, 102, 0);"&gt;setDocumentManager&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; mgr &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;OntModel m = ModelFactory.&lt;span style="color: rgb(0, 102, 0);"&gt;createOntologyModel&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; s &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;&lt;br&gt;Existen dos maneras de configurar un &lt;b&gt;OntDocumentManager&lt;/b&gt;, una es &lt;i&gt;programáticamente &lt;/i&gt;y la otra es a través de un &lt;i&gt;archivo de configuración (policy file)&lt;/i&gt;, el cual está expresado en RDF. La implementación de OntDocumentManager tiene una lista de URLs donde busca estos archivos, el &lt;i&gt;primero que resuelve&lt;/i&gt; es el que cargara como configuración por defecto. Si es necesario se puede cambiar la ruta donde busca la implementación con el método &lt;span style="color: red;"&gt;setMetadataSearchPath()&lt;/span&gt;.&lt;br&gt;Existe mucha configuración relacionada al modelo, por ejemplo la manera de tratar los imports si se procesan o no, como resolver en el caso que la URL no sea encontrada, como trabajar localmente y cómo manejar el caching de modelos cargados con imports. Todo esto es simple y puede encontrarse en forma detallada en la documentación de Jena o en el javadoc del API.&lt;br&gt;&lt;br&gt;Para seguir detallando un poco más el API de Jena e ir profundizando en sus funcionalidades, pasaremos a describir la interface &lt;b&gt;OntResource&lt;/b&gt;.&lt;br&gt;Todas las clases del API de OWL de Jena que representan un valor en la ontología implementan o extienden esta interface. OntResource, a su vez extiende la interace &lt;b&gt;Resource &lt;/b&gt;(RDF).&lt;br&gt;Algunos atributos comunes en la ontología son representados como métodos en la interface, por ejemplo&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; * versionInfo&lt;br&gt;&amp;nbsp; &amp;nbsp; * comment&lt;br&gt;&amp;nbsp; &amp;nbsp; * label&lt;br&gt;&amp;nbsp; &amp;nbsp; * seeAlso&lt;br&gt;&amp;nbsp; &amp;nbsp; * isDefinedBy&lt;br&gt;&amp;nbsp; &amp;nbsp; * sameAs&lt;br&gt;&amp;nbsp; &amp;nbsp; * differentFrom &lt;br&gt;&lt;br&gt;y para cada un de ellos sus patrones correspondientes &lt;span style="color: red;"&gt;&lt;i&gt;get, add, is, has, list, remove&lt;/i&gt;.&lt;/span&gt;&lt;br&gt;&lt;br&gt;Para terminar con esta entrega damos un pequeño ejemplo de como utilizar ciertos métodos de la interface, tomamos el ejemplo de la página de Jena para el caso de creación de un editor de ontologías y listar los tipos inferidos y los tipos afirmados (inferred vs asserted):&lt;br&gt;&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (java):&lt;/div&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//creación del modelo base&lt;/span&gt;&lt;br&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;String&lt;/span&gt;&lt;/a&gt; SOURCE = &lt;span style="color: rgb(255, 0, 0);"&gt;"http://www.eswc2006.org/technologies ontology"&lt;/span&gt;;&lt;br&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AString+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;String&lt;/span&gt;&lt;/a&gt; NS = SOURCE + &lt;span style="color: rgb(255, 0, 0);"&gt;"#"&lt;/span&gt;;&lt;br&gt;OntModel base = ModelFactory.&lt;span style="color: rgb(0, 102, 0);"&gt;createOntologyModel&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; OWL_MEM &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;base.&lt;span style="color: rgb(0, 102, 0);"&gt;read&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; SOURCE, &lt;span style="color: rgb(255, 0, 0);"&gt;"RDF/XML"&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//creacion del modelo inferido a travez del modelo base&lt;/span&gt;&lt;br&gt;OntModel inf = ModelFactory.&lt;span style="color: rgb(0, 102, 0);"&gt;createOntologyModel&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; OWL_MEM_MICRO_RULE_INF, base &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//creacion de un individuo&lt;/span&gt;&lt;br&gt;OntClass paper = base.&lt;span style="color: rgb(0, 102, 0);"&gt;getOntClass&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; NS + &lt;span style="color: rgb(255, 0, 0);"&gt;"Paper"&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;Individual p1 = base.&lt;span style="color: rgb(0, 102, 0);"&gt;createIndividual&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; NS + &lt;span style="color: rgb(255, 0, 0);"&gt;"paper1"&lt;/span&gt;, paper &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//Listado de los tipos asertados&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(177, 177, 0);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AIterator+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;Iterator&lt;/span&gt;&lt;/a&gt; i = p1.&lt;span style="color: rgb(0, 102, 0);"&gt;listRDFTypes&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;; i.&lt;span style="color: rgb(0, 102, 0);"&gt;hasNext&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3ASystem+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;out&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;println&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; p1.&lt;span style="color: rgb(0, 102, 0);"&gt;getURI&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;" is asserted in class "&lt;/span&gt; + i.&lt;span style="color: rgb(0, 102, 0);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//Listado de los tipos inferidos&lt;/span&gt;&lt;br&gt;p1 = inf.&lt;span style="color: rgb(0, 102, 0);"&gt;getIndividual&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; NS + &lt;span style="color: rgb(255, 0, 0);"&gt;"paper1"&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(177, 177, 0);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3AIterator+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;Iterator&lt;/span&gt;&lt;/a&gt; i = p1.&lt;span style="color: rgb(0, 102, 0);"&gt;listRDFTypes&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;; i.&lt;span style="color: rgb(0, 102, 0);"&gt;hasNext&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br&gt; &amp;nbsp; &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=allinurl%3ASystem+java.sun.com&amp;amp;bntI=I%27m%20Feeling%20Lucky"&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;&lt;/a&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;out&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;println&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; p1.&lt;span style="color: rgb(0, 102, 0);"&gt;getURI&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;" is inferred to be in class "&lt;/span&gt; + i.&lt;span style="color: rgb(0, 102, 0);"&gt;next&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;En la próxima entrega veremos en más detalle el API de OWL de Jena, algunos ejemplos sencillos que sirvan de introducción y de guía a los que se inician en el tema. Cumpliremos con la promesa de la persistencia y nos introduciremos en el API de inferencia. Cuando culminemos con el API de Jena, comenzaremos a ver OWL-API y luego una introducción a Pellet.&lt;br&gt;&lt;br&gt;Hasta la próxima….&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-5655799788699648093?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/5655799788699648093/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=5655799788699648093' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/5655799788699648093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/5655799788699648093'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2008/03/frameworks-y-ontologas-parte-2.html' title='Frameworks y ontologías (Parte 2)'/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-6563230825371106703</id><published>2008-04-10T17:02:00.000-03:00</published><updated>2009-01-21T07:58:51.557-02:00</updated><title type='text'></title><content type='html'>Frameworks y Ontologías (Parte 1)&lt;br&gt;&lt;br&gt;El concepto de &lt;b&gt;Ontologías&lt;/b&gt; viene desde hace un tiempo tomando fuerza en el mundo de los sistemas de información. Todos o una gran mayoría de ustedes tienen que haber escuchado mencionar el término &lt;b&gt;“Web Semántica”&lt;/b&gt;. A grandes rasgos este proyecto trata de dotar de semántica a las páginas web que conocemos actualmente con el motivo de hacer búsquedas más elaboradas en donde el agente que está buscando no obtenga resultados que no sean de interés. Al mismo tiempo se busca lograr interoperatibilidad entre sistemas de información.&lt;br&gt;&lt;br&gt;La pregunta es: ¿Cuál es el rol que tienen las ontologías? La respuesta es sencilla, la información semántica anexada a la Web necesita de algún formalismo, es ahí donde interviene el término ontología. Una ontología hace referencia a la conceptualización exhaustiva y rigurosa de un dominio determinado facilitando la comunicación y la compartición de información entre diferentes sistemas.&lt;br&gt;&lt;br&gt;De esta manera es como aparecen los frameworks que hoy conocemos, RDF, RDF Schema y OWL, los cuales nos permiten definir los metadatos necesarios en forma de ontologías.&lt;br&gt;&lt;br&gt;Este tutorial no intenta brindar un marco teórico al tema de Ontologías, como tampoco pretende abordar tópicos relacionados a las distintas metodologías que existen para de creación de éstas. Pero cabe destacar que se necesitará un entendimiento previo del tema debido a que el texto intenta ser una explicación práctica de la manipulación de las tecnologías circundantes al tema.&lt;br&gt;&lt;br&gt;Por ende no pretendo dar una descripción en detalle de los lenguajes mencionados anteriormente, pero si a fines prácticos mencionar que cada uno de estos formalismos está codificado en XML, si bien, el estándar no solo propone la codificación en XML (para un procesamiento adecuado por las máquinas), sino que también provee una sintaxis abstracta la que pudiera ser llevada a otros lenguajes.&lt;br&gt;&lt;br&gt;La aparición de estos lenguajes provocó el desarrollo de un conjunto de frameworks, APIs, la mayoría escritas en Java que nos permiten manipular las ontologías casi en su totalidad y también razonar en base a ellas. Así fue como aperecion Jena, Pellet (Razonador OWL-DL), OWL API, etc. És aquí donde haremos incapié, es decir, en como utilizar todas éstas herramientas para nuestro beneficio.&lt;br&gt;&lt;br&gt;En esta primera entrega vamos a hablar de Jena y como dar los primeros pasos acerca de la manipulación de las ontologías y en la segunda parte abordaremos lo relacionado al razonamiento.&lt;br&gt;&lt;br&gt;Jena es un framework que nos provee de un entorno de desarrollo para RDF, RDFS, OWL y SPARQL, como también nos provee de la capacidad de contar con un motor de inferencia basado en reglas. Por todo lo dicho anteriormente Jena cuenta con el siguiente conjunto de APIs que enumeramos a continuación:&lt;br&gt;&lt;ul style="margin-top: 0pt; margin-bottom: 0pt;"&gt;&lt;li&gt;APIs de RDF&lt;/li&gt;&lt;li&gt;API de OWL&lt;/li&gt;&lt;li&gt;API ARQ para manejo de SPARQL (lenguaje utilizado para realizar consultas a la ontología)&lt;/li&gt;&lt;li&gt;Soporte de persistencia&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Comenzaremos viendo como utilizar el API de OWL. Vamos a suponer que los lectores están familiarizados con la terminología de RDF y que poseen conocimientos en Java.&lt;br&gt;Como bien se describía anteriormente, existen distintos lenguajes RDF, RDF Schema, OWL, etc. En el orden en que fueron mencionados es en el orden en el cual van aumentando su poder de expresividad semántica. A su vez OWL tiene tres variantes las cuales son &lt;i&gt;OWL-Lite&lt;/i&gt;, &lt;i&gt;OWL-DL&lt;/i&gt; y &lt;i&gt;OWL-Full&lt;/i&gt;, lo mismo para ellos, donde OWL-Full es más rico en expresividad que OWL-DL y éste mas que OWL-Lite.&lt;br&gt;&lt;br&gt;El API de OWL de Jena utiliza un lenguaje neutral, es decir, los nombres de las clases no hacen mención al lenguaje subyacente que están representando (OWL, RDF, etc). Por ejemplo, la clase OntClass puede hacer referencia a una Clase OWL, o de RDF Schema, etc. Para representar las diferencias entre los distintos lenguajes, cada uno posee un profile que lista todos los contructores permitidos como los nombres de las clases y propiedades. Éste profile está unido al Ontology Model (OntModel) que es una versión extendida de la clase Model de Jena. La clase Model permite acceso a las sentencias en formato de recursos RDF. La clase OntModel extiende Model, agregando soporte para las sentencias que conforman OWL, como clases y jerarquías de clases, propiedades y jerarquías de propiedades e individuos. Cabe destacar que toda la información del modelo subyacente sea con OntModel como con Model esta almacenada en forma de tripletas RDF. Por ejemplo, supongamos que tenemos un objeto OntClass representando una determinada clase de nuestra ontología. Ésta clase tiene un método para determinar sus superclases, listSuperClasses() que se corresponde al valor de la propiedad rdf:SubClassOf de RDF. Cuando llamemos al método, Jena, obtendrá la información desde el modelo subyacente (Tripletas RDF), con lo que quiero dejar en claro que el objeto OntClass no guarda ninguna información de éstas características.&lt;br&gt;&lt;br&gt;Continuando con los conceptos básicos acerca de como maneja Jena los recursos, presentaremos como el framework trabaja la manera del polimorfismo en Java. Supongamos que tenemos la siguiente afirmación de declaración de un recurso.&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (xml):&lt;/div&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;lt;owl:Class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;rdf:ID&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Persona"&lt;/span&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;lt;/owl:Class&lt;span style="font-weight: bold; color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;&lt;br&gt;Ésto representa un recurso que declara con la URI relativa &lt;b&gt;#Persona&lt;/b&gt; una Clase OWL. Entonces podríamos decir que la manera más obvia de declarar esto en Java sería instanciando la clase OntClass. Ahora supongamos que agregamos la siguiente información en forma de tripleta RDF al modelo, agregando más información a la declaración anterior.&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (xml):&lt;/div&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;lt;owl:Class&lt;/span&gt; &lt;span style="color: rgb(0, 0, 102);"&gt;rdf:ID&lt;/span&gt;=&lt;span style="color: rgb(255, 0, 0);"&gt;"Persona"&lt;/span&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;lt;rdf:type&lt;/span&gt; owl:Restriction &lt;span style="font-weight: bold; color: black;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;span style="font-weight: bold; color: black;"&gt;&amp;lt;/owl:Class&lt;span style="font-weight: bold; color: black;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;&lt;br&gt;Esto significa que Persona es una &lt;b&gt;OLW:Restriction&lt;/b&gt;. Una owl:Restriction es una subclase de &lt;b&gt;owl:Class&lt;/b&gt;. El problema que tenemos en Java es que no podemos de manera dinámica cambiar la clase del objeto que representa el recurso. El recurso no cambio, porque sigue teniendo la URI &lt;b&gt;#Persona&lt;/b&gt;, pero se puede optar por el modelo que ha cambiado de &lt;i&gt;Class a Restriction&lt;/i&gt;. Por el contrario, si yo subsecuentemente elimino del modelo la &lt;b&gt;rdf:type owl:Restriction&lt;/b&gt; ésta no sería más adecuada.&lt;br&gt;&lt;br&gt;Otro ejemplo, en OWL – Full toda clase puede ser una owl:ObjectProperty, ésto indica que no podemos hacer un mapeo único entre los recursos RDF y las clases de Java, porque un objeto sería OntClass y ObjectProperty a la vez.&lt;br&gt;&lt;br&gt;Jena resuelve el tema de los distintos niveles polimórficos de RDF y la abstracción de clases en Java (OntClass, Restriction, DataTypeProperty, ObjectProperty, etc) considerando a estas abstracciones como una &lt;b&gt;vista &lt;/b&gt;del Recurso. Es decir, existe una relación uno a muchos, un recurso puede ser representado por varias vistas. Por ejemplo si el recurso es una clase owl (owl:Class), éste puede ser representado por la vista OntClass, Jena provee de un método as() que permite mapear desde RDF a una vista permitida.&lt;br&gt;&lt;br&gt;En Java podríamos tener el siguiente código:&lt;br&gt;&lt;div class="codeheader"&gt;Código&lt;/div&gt;&lt;pre class="geshi"&gt;&lt;div style="border-bottom: 1px solid gray; margin-bottom: 0.3em;"&gt;GeSHi (java):&lt;/div&gt;Resource r = myModel.&lt;span style="color: rgb(0, 102, 0);"&gt;getResource&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; myNS + &lt;span style="color: rgb(255, 0, 0);"&gt;"Persona"&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;OntClass cls = &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;OntClass&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; r.&lt;span style="color: rgb(0, 102, 0);"&gt;as&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt; OntClass.&lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&lt;div style="border-top: 1px solid gray; margin-top: 0.3em;"&gt;Created by GeSHI 1.0.7.18&lt;/div&gt;&lt;/pre&gt;&lt;br&gt;En el código anterior, podemos observar que existe un modelo representado por myModel, en la Parte 2 del tutorial explicaremos como instanciar modelos y cargar ontologías, por ahora nos valemos que el modelo ya está creado. La variable myNS, es el namespace del recurso. Con el método &lt;b&gt;getResource()&lt;/b&gt; obtenemos el recurso en cuestión y aplicando el método &lt;b&gt;as()&lt;/b&gt; mapeamos el recurso a OntClass. Si el recurso fuera también una ObjectProperty podríamos hacer lo mismo. y mapearlo a la clase corespondiente.&lt;br&gt;&lt;br&gt;Como mencionamos anteriormente en la Parte 2 del tutorial veremos como Jena instancia los modelos, y también como se manejan los import de las ontologías y como se realiza la inferencia, estos conceptos, como los de persistir los modelos en Bases de Datos serán tratados en las próximas entregas.&lt;br&gt;&lt;br&gt;Espero que hallan obtenido la información necesaria y que sea de interés y agrado la lectura de este tutorial. Para mi fue un gusto redactarlo.&lt;br&gt;&lt;br&gt;Saludos y hasta la entrega de la segunda parte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-6563230825371106703?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/6563230825371106703/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=6563230825371106703' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/6563230825371106703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/6563230825371106703'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2009/01/frameworks-y-ontologas-parte-1-el.html' title=''/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-7253296962313513495</id><published>2007-11-01T22:33:00.001-03:00</published><updated>2007-11-01T22:37:15.720-03:00</updated><title type='text'></title><content type='html'>Es un gusto anunciar que &lt;a href="http://www.juglar.org"&gt;Juglar.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;org&lt;/span&gt;&lt;/a&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JUG&lt;/span&gt; del Litoral Argentino cuenta con un &lt;a href="http://www.blogjuglar.blogspot.com"&gt;blog&lt;/a&gt; dedicado a publicar las noticias de relevancia en el foro. También en el blog se pueden encontrar vínculos de interés, todos relacionados a la plataforma Java y sus tecnologías.&lt;br /&gt;Invito a todos a visitarlo, como &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;también&lt;/span&gt; a los que no &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;están&lt;/span&gt; registrados en &lt;a href="http://www.juglar.org"&gt;Juglar&lt;/a&gt; a registrarse y pasar a formar parte de la comunidad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-7253296962313513495?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/7253296962313513495/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=7253296962313513495' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/7253296962313513495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/7253296962313513495'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2007/11/es-un-gusto-anunciar-que-juglar.html' title=''/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-2146181954486384267</id><published>2007-10-26T07:37:00.000-03:00</published><updated>2007-10-26T08:00:35.255-03:00</updated><title type='text'></title><content type='html'>Ayer 25 de Octubre, se realizó una jornada organizada por &lt;span style="font-weight: bold;"&gt;Santa Fe Tecnológica&lt;/span&gt;, la misma tuvo lugar en el auditorio de la &lt;a href="http://www.frsf.utn.edu.ar/"&gt;Facultad Tecnológica&lt;/a&gt;, en la ciudad de Santa Fe, Argentina.&lt;br /&gt;En la misma disertaron, &lt;span style="font-weight: bold;"&gt;Andrés &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Testi&lt;/span&gt;&lt;/span&gt; miembro fundador de &lt;a href="http://http//www.juglar.org"&gt;Juglar,&lt;/a&gt; del cual también soy miembro fundador. &lt;a href="http://www.juglar.org/"&gt;Juglar&lt;/a&gt;, es una Java &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;User&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Group&lt;/span&gt; (Grupo de usuarios de Java), aproximadamente tiene 1 año de vida y cuenta con casi 200 usuarios activos, los cuales debaten sobre las tecnologías allegadas a la plataforma Java.&lt;br /&gt;También estuvieron presentes, la gente de &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;, los cuales hicieron una disertación sobre tecnologías como &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;adSense&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;adWords&lt;/span&gt;&lt;/span&gt;. Estas tecnologías son &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;esenciales&lt;/span&gt; para que una empresa pueda ganar prestigio y presencia en Internet.&lt;br /&gt;La gente de .&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;FOX&lt;/span&gt; también integro la jornada, realizando una exposición sobre las tendencias publicitarias en Internet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-2146181954486384267?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/2146181954486384267/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=2146181954486384267' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/2146181954486384267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/2146181954486384267'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2007/10/ayer-25-de-octubre-se-realiz-una.html' title=''/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-34306098.post-115867503634196845</id><published>2007-10-26T00:40:00.000-03:00</published><updated>2007-10-25T20:45:43.317-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inauguración'/><title type='text'></title><content type='html'>Este post es la &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;inauguración&lt;/span&gt; del Blog. El contenido de &lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;My&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; Blog&lt;/span&gt; será especialmente dedicado a lo referente a Sistemas de Información, desarrollo de software, nuevas tecnologías, etc.&lt;br /&gt;Si en algún momento se da, temas relacionados con la música y demás cosas de la vida, pero éstos en menor medida.&lt;br /&gt;Espero que la información que aquí &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;recida&lt;/span&gt; sea del agrado y del interés de las personas que lo lean y por supuesto de las que comenten y sugieran ideas.&lt;br /&gt;Quedo &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;inaugurado&lt;/span&gt;, ahora a escribir cosas importantes.&lt;br /&gt;Saludos a todos, desde Argentina para el mundo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/34306098-115867503634196845?l=csrinaldi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://csrinaldi.blogspot.com/feeds/115867503634196845/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=34306098&amp;postID=115867503634196845' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/115867503634196845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/34306098/posts/default/115867503634196845'/><link rel='alternate' type='text/html' href='http://csrinaldi.blogspot.com/2006/09/este-es-el-post-de-inaguracin-del-blog.html' title=''/><author><name>Cristian Rinaldi</name><uri>https://profiles.google.com/108221888675664107719</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-AzglBT0FNyM/AAAAAAAAAAI/AAAAAAAAAAA/igLhKXp_cOs/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
