DATAtourisme

Avec quel back-end manipulez vous les données?

Bonjour,

Je souhaite savoir comment vous faite pour récupérer et travailler la data.
Vous utilisez une librairie pour Symfony ? Java ?

Si je souhaite utiliser Java c’est possible ? Comment faite vous ? Avec quelle librairie ? Il faut que je travaille avec GraphQL ? merci

Bonjour,

Les données issues de DATAtourisme sont au format RDF, un modèle de graphe destiné à décrire des ressources et leurs relations. L’utilisation GraphQL n’est pas obligatoire, elle offre une alternative simplifiée à la manipulation de données RDF.

Pour profiter de la richesse des données de DATAtourisme, vous pouvez les charger et manipuler grâce à une librairie RDF. Vous pourrez alors, selon l’usage que vous souhaitez en faire, constituer votre propre format de données.

Chez Conjecto, nous utilisons principalement Java pour la manipulation de données RDF. La librairie Apache Jena a notre préférence, mais il en existe d’autres, comme Eclipse RDF4J.

Voici un exemple de chargement et manipulation de données de DATAtourisme grâce à Apache Jena et son composant de stockage sur disque TDB.

  1. Créer une base de données TDB à partir d’un fichier RDF (xml, nt, ttl…) issu de DATAtourisme avec l’utilitaire inclut dans Apache Jena :
tdbloader --loc /home/user/datatourisme fichier.nt fichier2.nt
  1. Utilisation de l’API Jena dans Java :
// Création de l'instance TDB
String directory = "/home/user/datatourisme" ;
Dataset dataset = TDBFactory.createDataset(directory) ;

// début d'une transaction
dataset.begin(ReadWrite.READ) ;

// Récupération du modèle par défaut
Model model = dataset.getDefaultModel() ;

// Récupération des POI
Resource poiType = model.createResource("https://www.datatourisme.gouv.fr/ontology/core#PointOfInterest");
ResIterator iterator = model.listResourcesWithProperty(RDF.type, poiType)
iterator.forEachRemaining(resource -> {
    // Pour chaque POI, afficher son nom
    String label = resource.getProperty(RDFS.label, "fr").getString();
    System.out.println(label);
});
   
// fin de la transaction
dataset.end() ;

Il ne reste plus qu’à vous familiariser avec les concepts de manipulation de données graphe. La documentation de Jena vous aide à les appréhender pas à pas : Apache Jena - An Introduction to RDF and the Jena RDF API

Ce n’est qu’une possibilité parmi tant d’autres. Vous pourriez notamment être intéressé par le language de requête SPARQL.

Cordialement.

1 « J'aime »

je ne m’attendais pas à une réponse aussi… complète…
sincèrement, merci…
J’ai du mettre sur pause un projet pour découvrir la manipulation de data…
Mais vous venez de m’éclaircir énormément.

sincèrement, merci

Pour de la manipulation avec java, le mieux c’est quoi ? De rester en RDF ? De tout traduire en SQL ?
(niveau rapidité, fluidité, etc…? )

Je souhaite pouvoir manipuler les données de la façon la + simple et + fluide possible.

Je suis arrivé à le faire fonctionner. Parcontre je ne comprend pas trop cette ligne:
Resource poiType = model.createResource(« DATAtourisme »);
Cela sert à donner la liste des catégories du data center à Java ?!

Ok pour le principe de la manipulation de date, mais si vous voulez avoir des renseignements précise sur certain élément comment faite vous ? Vous enregistreriez les données dans un mysql/postgrés par exemple ? connaitre la liste des POI dans Paris de la catégorie restaurant par exemple?
je peux considéré que TDB remplace un postgrés / mysql, je peux faire les mêmes manipulation ?!

Il n’est pas possible d’échanger ailleurs qu’ici @conjecto ?

j’ai utilisé un ancien flux pour faire un test vec TBDG et RDF-xml; tbdloader à fonctionné.

En revanche, avec un nouveau flux [line: 51382, col: 17] {W113} rdf:language is not a recognized RDF property or type.

flux-9698-202102170824.rdf

Bonsoir,

Pour de la manipulation avec java, le mieux c’est quoi ? De rester en RDF ? De tout traduire en SQL ? (niveau rapidité, fluidité, etc…? )

Les données RDF sont des données graphes qui ne peuvent être représentées dans un format relationnel classique, sur lequel s’appuie SQL. Vous ne pouvez donc pas utiliser SQL pour exploiter des données RDF.

Je souhaite pouvoir manipuler les données de la façon la + simple et + fluide possible.

S’il s’agit d’effectuer des traitements, le plus rapide et le plus simple reste selon nous l’utilisation des concepts de stream de Java8, parfaitement compatibles avec la librairie Jena. Mais il s’agit là de concepts qui peuvent paraître complexes à appréhender lorsque l’on débute Java.

Je suis arrivé à le faire fonctionner. Parcontre je ne comprend pas trop cette ligne:
Resource poiType = model.createResource(« DATAtourisme »);
Cela sert à donner la liste des catégories du data center à Java ?!

Cette ligne permet d’obtenir un objet qui représente la classe RDF PointOfInterest. Cette objet peut ensuite être utilisé pour par exemple créer un itérateur (ligne d’aprés)

Ok pour le principe de la manipulation de date, mais si vous voulez avoir des renseignements précise sur certain élément comment faite vous ? Vous enregistreriez les données dans un mysql/postgrés par exemple ? connaitre la liste des POI dans Paris de la catégorie restaurant par exemple?
je peux considéré que TDB remplace un postgrés / mysql, je peux faire les mêmes manipulation ?!

TDB est une base graphe sémantique (Triplestore) alors que MySQL et PostgreSQL sont des bases relationnelles. Elles ne peuvent se substituer l’une à l’autre. Pour exploiter du RDF, il faut le charger dans un Triple store : Triplestore — Wikipédia

Pour pouvoir explorer les données RDF vous devez en connaître la structure : c’est le rôle de l’ontologie, dont vous trouverez la dernière version ici :

C’est grâce à l’ontologie que vous connaitrez les propriétés accessibles pour chaque type de POI et les éléments communs du thésaurus.

Il n’est pas possible d’échanger ailleurs qu’ici @conjecto ?

Cette espace est le meilleur endroit pour échanger : d’autres réutilisateurs peuvent se poser les mêmes questions que vous, il est important qu’ils puissent profiter de nos réponses.

avec un nouveau flux [line: 51382, col: 17] {W113} rdf:language is not a recognized RDF property or type.

Après avoir essayé de charger votre flux dans une base TDB, il apparait que le message que vous évoquez est un simple avertissement qui n’affecte en rien de chargement des données RDF.

Cordialement.

2 « J'aime »

bonjour,

ok merci pour vos réponses. Je dois, pour le moment mettre en pause mon projet, je vous tiendrez au courant d’ici 1 bon mois (quand j’aurai repris mon projet)

Ok je suis bien arrivé à le faire sur java.

Par contre, pourquoi j’ai ceci:
<ns0:isLocatedAt rdf:resource=« La ressource demandée n'existe pas ! | DATAtourisme »/>

Pourquoi 'isLocatedAt" retourne vers un lien ? Pourquoi je n’ai pas directement la valeur de la localisation directement dans le .rdf que j’ai généré ?

Autrement dit,
// Pour chaque POI, afficher son nom
String label = resource.getProperty(RDFS.label, « fr »).getString();
System.out.println(label);

Comment je peux afficher sa localisation? J’ai mal généré mon .rdf ?

merci

Bonjour,

En RDF les Identifiants uniques (ID) des ressources sont des URI Uniform Resource Identifier — Wikipédia

La balise XML que vous avez extraite signifie : a la propriété isLocatedAt (DATAtourisme) dont la valeur est la ressource qui a l’identifiant https://data.datatourisme.gouv.fr/702f460d-fb1f-3129-840c-319c9e49fb5b.
Si vous faites une recherche dans votre fichier vous trouverez les propriétés de cette ressource/objet de type Place DATAtourisme.

En Java il faut aller chercher la ressource de type Place pointée par la propriété ns0:isLocatedAt (comme vous l’avez fait avec la propriété rdfs:label) puis utiliser les propriétés de localisations (Latitude, longitude, adresse, etc …) qui sont listées et décrites dans les documents précédemment cités.

Cordialement.

Ok merci beaucoup pour vos explications !