Consultas SPARQL sobre un almacen de datos con Jena/SDB

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() ; }
    }
}
Twitter Digg Delicious Stumbleupon Technorati Facebook Email

16 Respuestas para “Consultas SPARQL sobre un almacen de datos con Jena/SDB”

  1. 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. 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. 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. 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. 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. 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. 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. Muy buena explicación.
    Gracias

  9. 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!

  10. Buenas!!

    Seguí este post y me funcionó todo perfectamente pero luego intenté hacer esto para la clase .java de un web service y a la hora de crear el cliente me sale la excepción Invocation.Target.Exception.

    ¿Alguien sabe por qué puede ser?

    Estoy trabajando en windows por lo que te tengo isntalado SDB,Jena y ARQ dentro de Cygwin.

    Un saludo y muchas gracias! 🙂

  11. Hola,

    se puede alamcenar en SDB un Model ya generado. ¿Como se haria? No encuentro nada por la web, gracias,
    🙂

  12. Hola de nuevo,

    sigo dandole vueltas y no veo la manera de hacer una cosa aparentemente tan sencilla con SDB y Jena como almacenar un modelo ya generado y modificado, de manera que luego pueda volverlo a leer y tratarlo.

    La unica solución que se me ha ocurrido ha sido la de almacenarlo en un fichero temporal una vez generado y leerlo, pudiendo asi usar la funcion model.read(), que supuestamente almacena el modelo en la BBDD. Seria asi:

    String inputFileName=»c://Users//JORGE//workspace//gestionate//WebContent//resources//temp_xml.owl»;
    File file = new File(inputFileName);
    //Hay que capturar las Excepciones
    if (!file.exists()){
    file.createNewFile();
    }
    modelUrlResources.write(new PrintWriter(file));
    //Escribe el fichero temporal»);
    InputStream in = FileManager.get().open( inputFileName );
    Model nmModel = maker.createModel(login);
    nmModel.begin();
    nmModel.read(in,»RDF/XML»);
    //Leyendo el fichero temporal»);
    nmModel.commit();

    Pero aun asi esto tampoco funciona, cualquier sugerencia sera bienvenida. Gracias¡¡¡

  13. Hola buenos dias .
    Estoy desarrollando una ontologia en protege 3.4 pero al hacer consultas me marca error mi duda es que si debo instalar algun plugins.
    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 Informatica, tiene las subclases, Software y Hardware, y estas a su vez mas subclases.

    Como obtego todos los elementos de la clase informatica?

    porque con el:

    ?element rdf:type ?Informatica.

    No me da resultados.

    muchas gracias!

  14. Nombre Requerido 17. Ago, 2012 en 10:48 pm

    Hola a todos. Me gustaría saber como puedeo añadir las librerías de Jena al Eclipse para que pueda reconocerlas. GRacias.

  15. Hola a todos. Me gustaría saber cómo añado las librerías de Jena al Eclipse.
    Gracias.

  16. O en Netbeans. Realmente tengo los dos entornos de desarrollo instalados.