SpazioCodice

tests integration SPARQL SOLRRDF

Tests d’intégration SPARQL avec SolRDF

En 2014, j’ai eu l’opportunité de contribuer à un projet formidable, CumulusRDF, un store RDF sur une architecture cloud. Le test d’intégration du projet a été une tâche vraiment complexe.

J’ai utilisé JUnit pour exécuter certains exemples tirés de Learning SPARQL de Bob DuCharme (O’Reilly, 2013). Tant O’Reilly que l’auteur (merci beaucoup au passage) m’ont donné la permission de le faire dans le cadre du projet.

Ainsi, lorsque j’ai mis en place le premier prototype de SolRDF, je me suis demandé comment je pourrais créer un test d’intégration complet (plus ou moins de la même manière)… et j’en suis venu à la conclusion évidente que certaines parties de ce travail pouvaient être réutilisées.

Cependant, certaines choses devaient être modifiées. Cela est principalement dû au fait que CumulusRDF utilise Sesame comme le cadre sous-jacent pour RDF, tandis que SolRDF utilise Apache Jena… Au final, cela n’a nécessité qu’un changement mineur… ce sont deux solutions valides, faciles et puissantes.

Ainsi, dans LearningSPARQL_ITCase, nous avons :

  • une méthode de configuration pour charger les données d’exemple ;
  • une méthode de nettoyage pour vider le store ;

Les données d’exemple sont fournies, sur le site LearningSPARQL, dans plusieurs fichiers. Chaque fichier peut contenir un petit ensemble de données ou une requête, ou un résultat attendu (au format tabulaire). En revenant à la suite de tests, le flux doit charger le petit ensemble de données, X, exécuter la requête Y et vérifier les résultats, Z.

Bien que dans un article précédent, nous ayons décrit comment charger un ensemble de données d’exemple dans SolRDF, cela peut être fait depuis la ligne de commande et non dans un test JUnit. Au lieu de cela, en utilisant Jena, nous pouvons automatiser le chargement des données dans SolRDF avec ces quelques lignes.

				
					// DatasetAccessor provides access to
// remote datasets using SPARQL 1.1 Graph Store HTTP Protocol
DatasetAccessor dataset = DatasetAccessorFactory.createHTTP(); 
Dataset memoryDataset = DatasetFactory.createMem();
// Load a local memory model
Model memoryModel = memoryDataset.getDefaultModel(); 
// Load the memory model in the remote dataset 
memoryModel.read(dataURL, ...);
dataset.add(memoryModel);
				
			

Super, les données ont été chargées ! Dans un autre post, j’expliquerai ce que j’ai fait, dans SolRDF, pour supporter le protocole SPARQL 1.1 Graph Store HTTP.

Il est maintenant temps d’exécuter quelques requêtes pour vérifier et valider les résultats correspondants. Comme vous pouvez le voir, les tests exécutent la même requête deux fois : la première contre un modèle en mémoire, la deuxième contre SolRDF. De cette manière, en supposant que le comportement du modèle en mémoire Jena soit une vérité de référence, chaque test sera capable de vérifier et comparer les résultats provenant de SolRDF :

				
					final Query query = QueryFactory.create(readQueryFromFile(...));
QueryExecution execution = null;
QueryExecution memExecution = null; 
try {
 execution = QueryExecutionFactory.sparqlService(SOLRDF_URL, query);
 memExecution = QueryExecutionFactory.create(query, memoryDataset);
 ResultSet rs = execution.execSelect();
 ResultSet mrs = memExecution.execSelect();
 assertTrue(ResultSetCompare.isomorphic(rs, mrs));
 } catch (...) {
  ...
 } finally {
  // Close executions 
 }
				
			
Enfin, le store RDF doit être vidé après chaque test. Bien que le protocole Graph Store soit très utile à cet effet, il ne peut pas être implémenté dans Solr car certaines méthodes HTTP (i.e. PUT et DELETE) ne peuvent pas être utilisées dans les RequestHandlers : Solr permet ces méthodes uniquement pour les requêtes /schema et /config. Donc, bien qu’un nettoyage puisse être facilement effectué en utilisant quelque chose comme ceci :
				
					dataset.deleteDefault();
				
			

Ou, en HTTP :

				
					DELETE /rdf-graph-store?default HTTP/1.1 
Host: example.com
				
			

Il n’est pas possible de l’implémenter, donc la seule approche restante est une solution simple avec Solr :

				
					SolrServer solr = new HttpSolrServer(SOLRDF_URI);
solr.deleteByQuery("*:*");
solr.commit();
				
			

Cela n’a rien à voir avec RDF et le protocole Graph Store, mais pour cet usage (spécifiquement pour les tests), cela semble être un bon compromis.

C’est tout ! J’ai fusionné tout ça dans la branche master, donc n’hésitez pas à jeter un coup d’œil. Si vous voulez exécuter la suite de tests d’intégration, vous pouvez le faire depuis la ligne de commande :

				
					> cd $SOLRDF_HOME
> mvn clean install
				
			

Ou dans Eclipse, en utilisant la configuration de lancement Maven prédéfinie :

solrdf/src/dev/eclipse/run-integration-test-suite.launch.

Il suffit de faire un clic droit sur ce fichier et de choisir « Exécuter en… ». Après avoir démarré la suite, vous pourrez voir ces messages :

				
					...
(build messages)
...
[INFO] ---------------------------------------------------
[INFO] Building Solr RDF plugin 1.0
[INFO] ---------------------------------------------------
...
(unit tests)
...
[INFO] ---------------------------------------------------
[INFO] TESTS
[INFO] ---------------------------------------------------
...
Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.691 sec
Tests run: 15, Failures: 0, Errors: 0, Skipped: 0
...
(cargo section. It starts the embedded Jetty)
...
[INFO] [beddedLocalContainer] Jetty 7.6.15.v20 Embedded starting...
...
[INFO] [beddedLocalContainer] Jetty 7.6.15.v20 Embedded started
...
(integration tests section)
...
[INFO] ---------------------------------------------------
[INFO] TESTS
[INFO] ---------------------------------------------------
...
Running org.gazzax.labs.solrdf.integration.LearningSparql_ITCase
[INFO] Running Query with prefixes test...
[INFO] [store] webapp=/solr path=/rdf-graph-store params={default=} status=0 QTime=712
...
[DEBUG] : Query type 222, incoming Accept header...
...
[INFO] [store] Closing main searcher on request.
...
[INFO] [beddedLocalContainer] Jetty 7.6.15.v20140411 Embedded is stopped
[INFO] --------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] --------------------------------------------------
[INFO] Total time: 42.302s
[INFO] Finished at: Tue Feb 10 18:19:21 CET 2015
[INFO] Final Memory: 39M/313M
[INFO] --------------------------------------------------
				
			

Share this post

Laisser un commentaire

En savoir plus sur SpazioCodice

Abonnez-vous pour poursuivre la lecture et avoir accès à l’ensemble des archives.

Poursuivre la lecture