Consultas SPARQL sobre un almacen de datos con Jena/SDB

Patxi, March 30th, 2009

Dentro del trabajo de investigación que estoy llevando a cabo en el doctorado me está tocando trabajar con Ontologías OWL y con almacenes de tripletas RDF. La mayoría de las veces necesito únicamente cargar los datos que tengo en RDF en el almacén de tripletas y luego realizar consultas para realizar cálculos sobre los datos o exportarlos a un modelo relacional.

Para ello utilizo una herramienta que se llama Jena/SDB que me está funcionando bastante bien. Lo que hace es ofrecer un almacenamiento de tripletas RDF y su acceso mediante consultas SPARQL, almacenando las tripletas en una base de datos relacional como MySQL en mi caso.

Su uso es muy sencillo, vamos a ver a continuación cómo crear un almacén, cómo cargar datos y cómo realizar alguna consulta tanto desde consola como desde Java.

Para la instalación es suficiente con descargar el zip de la página web y descomprimirlo, asigando permisos de ejecución (chmod u+x) a los archivos de la carpeta bin si estamos en Linux.

Una vez instalado el primer paso es crear el almacen de tripletas, para lo cual crearemos un archivo por ejemplo con el nombre store.ttl con el siguiente contenido.

 @prefix rdfs:     <http://www.w3.org/2000/01/rdf-schema#> .
 @prefix rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
 @prefix ja:        <http://jena.hpl.hp.com/2005/11/Assembler#> .
 @prefix sdb:     <http://jena.hpl.hp.com/2007/sdb#> .

 _:c rdf:type sdb:SDBConnection ;
     sdb:sdbType        "mysql" ;
     sdb:sdbName        "rdf_testdb" ;
     sdb:sdbHost        "localhost" ;
     sdb:sdbUser   "userdb";
     sdb:sdbPassword   "pwddb";
     sdb:driver         "com.mysql.jdbc.Driver" ;
     .

 [] rdf:type sdb:Store ;
     sdb:layout         "layout2/index" ;
     sdb:sdbName        "rdf_testdb" ;
     sdb:connection     _:c ;
     .

En él se indica que se utilizará mysql como almacenamiento y cómo acceder a la base de datos que contendrá la información: servidor (localhost), usuario (userdb), contraseña (pbddb) y nombre de la base de datos (rdf_testdb).

Una vez hecho esto ya podemos crear el almacen de tripletas RDF sobre la base de datos indicada.

$ sdbconfig --sdb store.ttl --format

Si da algún error puede ser necesario que creemos las siguientes variables de entorno indicando el path donde está instalado SDB.

$ export SDBROOT=/path-to-jena-sdb
$ export PATH=$SDBROOT/bin:$PATH

El paso siguiente consiste en cargar la información RDF y crear los índices a continuación. Es conveniente hacerlo en este orden sobretodo si vamos a cargar muchos datos.

$ sdbload --sdb store.ttl file.rdf
$ sdbconfig --sdb store.ttl --indexes

Ya tenemos la información cargada y podemos consultarla con consultas SPARQL. Imaginemos por ejemplo que hemos cargado una ontología con estilos de música y autores. Podríamos solicitar obtener todas las canciones de las que es autor Elvis Presley con la siguiente consulta.

   "PREFIX po:  <http://www.example.com/PruebasOntology.owl#> "+
   "SELECT ?cancion "+
   "WHERE  "+
   "{  "+
   "   po:Elvis_Presley po:isAutorCancion ?cancion . "+
   "}";

Esto mismo podríamos hacer desde Java utilizando el API de Jena. Para ello deberíamos crear un nuevo proyecto, por ejemplo con NetBeans y añadir las librerías .jar de la carpeta lib de SDB. El siguiente código muestra cómo conectar con el almacén RDF y realizar la consulta recorriendo el recordset registro a registro. Existe también un método específico que muestra por pantalla directamente los resultados en forma de tabla sin tener que recorrerlos.


import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.sdb.SDBFactory;
import com.hp.hpl.jena.sdb.Store;
import com.hp.hpl.jena.sdb.store.DatasetStore;

public class Main {

    public static void main(String[] args)  throws Exception {

        Store store = SDBFactory.connectStore("/path-to-store/store.ttl") ;
        if(store != null){
            System.out.println("Conexión al store SDB ... Ok");
        }

        String stringQuery =
      "PREFIX po:  <http://www.example.com/PruebasOntology.owl#> "+
      "SELECT ?cancion "+
      "WHERE  "+
      "{  "+
      "   po:Elvis_Presley po:isAutorCancion ?cancion . "+
      "}";

        Dataset ds = DatasetStore.create(store) ;
        QueryExecution qe = QueryExecutionFactory.create(query, ds) ;
        try {
            ResultSet rs = qe.execSelect();
            while(rs.hasNext()){
                QuerySolution soln = rs.nextSolution() ;
                String link = soln.getResource("cancion").getURI();

      // mostrar por pantalla o realizar cualquier otro proceso con el dato
      System.out.println(link);
            }
        } finally { qe.close() ; }
    }
}
Compártelo:
  • Twitter
  • Meneame
  • del.icio.us
  • Facebook
  • BarraPunto
  • Digg
  • Google Bookmarks
  • Netvibes
  • Bitacoras.com
  • LinkedIn
  • Tumblr
  • email
  • MySpace
  • Technorati
  • Add to favorites

9 Comentarios para “Consultas SPARQL sobre un almacen de datos con Jena/SDB”

  1. yarelis dice:

    Hola:
    Necesito un tutorial paso a paso de cómo realizar una consulta utilizando SPARQL a una ontología que aun se está confeccionando utilizando Protege…

    Ayuda please…

  2. monica dice:

    El código: $ sdbconfig –sdb store.ttl –format ¿en donde se escribe?

    En el link: http://blog.3kbo.com/2008/10/17/setting-up-mysql-on-mac-osx-for-jena-sdb/

    hay la siguiente línea: SDBROOT > bin/sdbconfig –sdb=sdb-index.ttl –create

    tengo una mac y he iniciado la Terminal, pero no se que tengo que hacer para que me salga el SDBROOT > ayuda por favor, muchas gracias.

  3. Jose dice:

    Buenas,

    ya sé que el post tiene algún tiempo pero ahí va mi pregunta, por si alguien la puede contestar.
    Descargo Jena y lo descomprimo. Creo un proyecto con Eclipse y añado las librerias de jena/lib. Copio el código que hay en tu post y Eclipse me dice que es incapaz de reconocer los imports del 2º-4º. A ver si a alguien le ha pasado lo mismo.

    Saludos y gracias.

  4. Fabricio dice:

    Hola que estoy haciendo mi proyecto de tesis y para esto necesito realizar consultas SPARQL sobre la base de datos ORACLE 11g, pero el problema es que no se como instalar llena y hacer la conexion me parece que es algo similar a mysql, pero no tengo idea si jena tiene una interfaz o algo…

    Gracias por la ayuda

  5. Fabricio dice:

    Hola Jose es que esas librerias que estan en la carpeta lib debes cargarlas en el eclipse yo utilice netbeans y ahi las añadi en la parte de librerias

    SAludos

  6. Marta dice:

    Hola a todos! Ya me ayudasteis una vez y… a ver si se puede otra ;)
    Queria preguntar, si alguno de vosotros a podido con el SDB de Jena realizar un count. Yo estoy con ello y no soy capaz. Esta es mi query:

    “SELECT count(*)”+
    “WHERE” +
    “{” +
    “?element pre:tiene ?name.”+
    “}”+
    “GROUP BY ?element”;

    y siempre me da fallos del tipo:

    Lexical error at line 1, column 84. Encountered: “(” (40), after : “count”

    Por lo que tengo entendido en Jena es posible este tipo de queries… pero yo no soy capaz :(

    Un saludo y gracias!!!

  7. Marta dice:

    Lo logre! simplemente:

    Query query = QueryFactory.create(queryString,Syntax.syntaxARQ);

    Aplica la syntax de ARQ y la Query funciona!!!!!!

    Gracias de todos modos y espero que os ayude!

    Un abrazo!

  8. Luis dice:

    Muy buena explicación.
    Gracias

  9. Marta dice:

    Aqui estoy de nuevo con otra pregunta.
    Es posible realizar una consulta en SPARQL que me de todos los elemtos de una clase y los elementos de sus subclases.

    por ejemplo, la clase persona, tiene las subclases, hombre y mujer, y estas a su vez mas subclases.

    Como obtego todos los elementos de la clase persona?

    porque con el:

    ?element rdf:type ?persona.

    No me da resultados.

    muchas gracias!

Deja un comentario