DATAtourisme

Request timeout


#1

Bonjour,

Il semblerait que le moteur de requête SPARQL soit paramétré avec un timeout “assez court”. Ma requête “complexe” programmée sur l’éditeur en ligne renvoie un résultat lors la prévisualisation (limitée à 10 échantillons). Cependant, lorsqu’elle est exécutée quotidiennement par le serveur, elle renvoie un résultat vide (seulement avec les en-têtes CSV) après plusieurs minutes.

Serait-il possible de confirmer cette limitation et de rallonger le timeout ?

Cordialement


#2

Bonjour,

Pour des raisons de performances de la plateforme, les requêtes complexes ne peuvent pas être traitées sur l’espace diffuseur.
Vous disposez cependant d’autres manières de réaliser ce que vous voulez :

  • soit en installant l’API (il existe un environnement docker pour vous faciliter la tache https://framagit.org/datatourisme/docker-stack) sur votre poste de travail et en téléchargeant toutes les données ou une sélection, vous pourrez ainsi faire ce que vous souhaitez sans limitation.
  • soit vous installez une instance de blazegraph sur votre poste de travail et téléchargez les données que vous souhaitez pour les charger dedans, vous y chargerez aussi le fichier ttl de l’ontologie disponible sur framagit et vous pourrez lancer la requête que vous voulez.
    L’une ou l’autre ne sont pas longues à mettre en oeuvre.

Je soupçonne que vous faites allusion à votre flux “Events”, il transforme les données Graph en CSV, ce qui nécessite quelques optimisations pour éviter les doublons et raccourcir son temps d’exécution. Si vous me le permettez je peux analyser votre requête et vous proposer une version optimisée pour le CSV.

Cordialement.


#3

Bonjour,

Effectivement, il s’agit bien du flux “Events”. Ne connaissant pas le langage SPARQL, j’ai du improvisé mais avec des réflexes de langage SQL. Je suis donc preneur de votre aide.

Cordialement


#4

Bonjour,

Je vous ai créé un flux Events_with_limit avec quelques modifications à la marge (que j’ai commenté).
Votre requête a trop de combinatoire, j’ai donc surtout ajouté une limite aux solutions qui sont calculées.
Il faudrait refondre votre requête avec l’esprit suivant : effectuer les “CONCAT” ou “GROUP_CONCAT” dans des sous-requêtes select et ne pas avoir (ou très peux) de GROUP BY sur le select principal.

Si j’ai bien compris vos messages sur le forum et l’esprit de votre requête vous avez besoin :

  • d’une ligne par période de chaque POI en générant un identifiant unique
  • regrouper les types qui correspondent à vos thèmes (CQuand) et les thèmes dans une même colonne
  • avoir dans une autre colonne les types de POI (rubrique)
  • avoir un seul contact (lequel est important pour vous ? administratif, réservation, propriétaire du POI, …)
  • une seule illustration
  • les coordonnées géographiques et adresse
  • avoir des colonnes à valeurs fixes
  • le tout en français

Le principe pour faire rentrer des données graph dans un format à plat (d’une manière performante) est d’aplatir les données à leur étage (grâce aux sous-requêtes select). Imaginez un arbre dont vous simplifiez les branches avant de les brancher au tronc.

Je vous invite à installer un blazegraph pour tester/créer votre requête.

(attention il vous faudra au moins 6G pour charger la base complète de DATAtourisme)

Voici (en version simplifiée) ce que pourrai être une telle requête :

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX schema: <http://schema.org/>
PREFIX : <https://www.datatourisme.gouv.fr/ontology/core#>
PREFIX dt: <https://www.datatourisme.gouv.fr/resource/core#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX ebucore: <http://www.ebu.ch/metadata/ontologies/ebucore/ebucore#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

######## SELECT #####################################
SELECT

	?obj_event
	?fournisseur
	?fournisseur_id
	## EVENT
	?debut
	?fin
	?guid
	?nom
	
######## WHERE #####################################
WHERE {
  
	## DATES
  
    {select 
     	?obj_event
     	?obj_id
        (CONCAT(STR(?date_debut), ' ', ?heure_debut) AS ?debut)
        (CONCAT(STR(?date_fin), ' ', ?heure_fin) AS ?fin)
        (CONCAT('@DATATOURISME:', REPLACE(STR(?obj_fournisseur), 'https://data.datatourisme.gouv.fr/', ''), '@', ?obj_id, '@', STR(?date_debut)) AS ?guid) # Not unique dc:identifier for several instances event
        where {
          	### Variables
			BIND(SUBSTR(STR(NOW()), 0, 11) AS ?aujourdhui)
          	?obj_event rdf:type :EntertainmentAndEvent ; # Generic DataTourisme EntertainmentAndEvent type only
				dc:identifier ?obj_id ;
            	:takesPlaceAt ?obj_schedule ;
				:hasBeenPublishedBy ?obj_fournisseur .
            ?obj_schedule :endDate ?date_fin
      		FILTER((STR(?date_fin) >= ?aujourdhui)) # Filter past events
      		?obj_schedule :startDate ?date_debut
      		# May not contain times properties
      		OPTIONAL {
          		?obj_schedule :startTime ?h_debut
			}
			OPTIONAL {
				?obj_schedule :endTime ?h_fin
			}
          BIND(COALESCE(?h_debut, '00:00:01') AS ?heure_debut) # Default start time if no start time defined
          BIND(COALESCE(?h_fin, '23:59:59') AS ?heure_fin) # Default end time if no end time defined

          } GROUP BY ?obj_id ?obj_fournisseur ?obj_event ?obj_schedule ?date_debut ?date_fin ?heure_debut ?heure_fin
        	
          
        }
  
 	### EVENT
	?obj_event rdfs:label ?nom.
		
		### DEFAULT VALUES
	VALUES ?fournisseur_id { 3 } # Refer to CQuand

	

	?obj_fournisseur schema:legalName ?fournisseur .
  
  
	### FILTER first for optimization ?
	FILTER(langMatches(lang(?nom), 'fr')) # Fench label only

}

Cordialement.


#5

Bonjour,

Merci pour votre investigation sur ma requête. Je refléchis effectivement depuis quelques jours à découper ma requête en sous requêtes. Cependant ma faible connaisse du SPARQL et des graphs me limite dans cette tâche. Dans une base de données relationnelle en SQL, cette tâche me semble plus simple en s’appuyant sur le schéma des tables . Quel document, équivalent au schéma des tables, pourrais-je utiliser pour réfléchir sur “l’aplatissement par étage” des données que vous proposer ? Je suppose que vous aller me répondre d’utiliser http://www.datatourisme.fr/ontology/visualization/ mais celui-ci n’est en fait pas très pratique (trop de paramétrages…).

Pour répondre à votre question, voici ligne par ligne, mes besoins :

Si j’ai bien compris vos messages sur le forum et l’esprit de votre requête vous avez besoin :

  • d’une ligne par période de chaque POI en générant un identifiant unique

oui, une ligne par “événement simple” : POI de type :EntertainmentAndEvent avec UNE date de début et UNE date de fin sans discontinuité (optionnellement les heures de début et de fin)

  • regrouper les types qui correspondent à vos thèmes (CQuand) et les thèmes dans une même colonne

oui, associer à ces événements une liste de mots clés en utilisant les “thèmes” DataTourisme ainsi qu’un mapping sur la propriété rdf:type et les sous-classes de :EntertainmentAndEvent. Selon moi, comme je l’ai déjà souligné dans un post, la nomenclature DataTourisme relative aux thèmes d’une part, et aux sous-classes :EntertainmentAndEvent d’autre part, me semble peu pertinente (ce n’est que mon avis lié à mon besoin). En effet, des termes d’un même niveau d’information peuvent se retrouver soit en sous-classe :EntertainmentAndEvent, soit en “thème”.

  • avoir dans une autre colonne les types de POI (rubrique)

oui, ventiler ces événements dans mes rubriques (clé de recherche rapide de haut niveau pour mes utilisateurs) en utilisant un mapping sur la propriété rdf:type et les sous-classes de :EntertainmentAndEvent, avec éventuellement la possiblité d’avoir un événement appartenant à plusieurs rubriques

  • avoir un seul contact (lequel est important pour vous ? administratif, réservation, propriétaire du POI, …)

oui, d’un point de vue utilisateur final d’un agenda d’événements (ma plateforme), il est important de pouvoir contacter l’organisateur de l’événement pour obtenir divers renseignements complémentaires, ou tout simplement vérifier, le jour J (même un dimanche), que l’événement a bien lieu pour éviter un déplacement inutile.

  • une seule illustration

oui et non, une illustration principale est un plus, (à condition qu’elle soit de bonne qualité et représentative). Il peut y avoir d’autres illustrations secondaires (sans hiérarchie). Le tout se situe dans la même colonne de mon CSV (liste d’illustrations) dont le premier item est la pincipale.

  • les coordonnées géographiques et adresse
    oui, c’est indispensable. J’aimerais aussi pouvoir identifier le “nom du lieu” (exemple “la salle De Coubertin”) s’il existe parmi l’adresse. Cependant, cette information est actuellement diluée dans la propriété schema:streetAddress, donc non extractible.
  • avoir des colonnes à valeurs fixes

oui, pour toutes les propriétés de ma plateforme non supportées (où non extractibles comme le “nom du lieu”) par DataToursime.

  • le tout en français
    oui et non, aujourd’hui ma plateforme ne dispose par des informations dans des langues étrangères mais je souhaiterais extraire prochainement de DataTourisme les informations disponibles aussi en anglais.

Je vais donc investiguer vers blazegraph comme vous me le suggérer. Cependant, j’aurais besoin d’un éclaircissement sur ce point. Blazegraph est-il seulement dédié au développement ? Dans ma version “de production”, je ne dispose pas d’hébergement pouvant faire tourner un framework tierce autre qu’en PHP.

Merci encore pour votre aide.

Cordialement


#6

Bonjour,

Blazegraph est un logiciel en Java de base de donnée RDF. Je vous invite à l’utiliser sur votre ordinateur pour travailler votre requête (même si vous pouvez aussi l’utiliser dans votre environnement de production).

L’outil de visualisation http://www.datatourisme.fr/ontology/visualization/#datatourisme_v2 avec l’option filter/Degree of collapsing à 0 permet de visualiser l’ensemble de l’ontologie. Ceci, je vous l’accorde, prend beaucoup de place sur un écran (d’où le fait que cette option ne soit pas à 0 par défaut) mais reflète la richesse des informations qui peuvent être fournies dans le cadre de données touristiques.

Pour rappel j’ai associé à votre compte un nouveau flux (Events_with_limit) qui reprend votre requête actuelle avec très peux de modification.

En espérant que cela vous aide.

Cordialement.