IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SPARQL Discussion :

Agrégats sur des dates ?


Sujet :

SPARQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut Agrégats sur des dates ?
    Bonjour,

    Est-il possible de calculer des aggrégats sur des dates en SPARQL ?

    Je m'explique sur un exemple concret, j'ai dans ma base des triplets du genre pour stocker des population par ville pour une date donnée :

    _:a :city X .
    _:a :date "2011-05-02" .
    _:a :population 65000 .

    _:b :city Y .
    _:b :date "2010-06-08" .
    _:b :population 32000 .

    etc
    Est-il possible avec ce genre de stocker sur les dates, de faire des agrégats par année ?

    Par exemple, j'aimerais avoir les moyennes des populations par an, est-ce possible ?

    Ou bien faudrait-il stocker les données temporelles dans 3 prédicats :année, mois et jour pour faciliter ce genre de requête ?

    Merci d'avance !

  2. #2
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par Neveldo Voir le message
    Est-il possible avec ce genre de stocker sur les dates, de faire des agrégats par année ?
    Oui, en utilisant la fonction "year" de SPARQL 1.1 (voir http://www.w3.org/TR/sparql11-query/#func-year). Attention il faut bien que tes dates soient stockées avec le datatype xsd:dateTime sinon ca n'a pas l'air de marcher.

    Citation Envoyé par Neveldo Voir le message
    Par exemple, j'aimerais avoir les moyennes des populations par an, est-ce possible ?
    Voilà ce que j'ai pu tester et qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select (year(?date) as ?year) (AVG(?population) as ?average)
    where {
      ?x <http://www.exemple.com/onto/date> ?date .
      ?x <http://www.exemple.com/onto/population> ?population .
    }
    GROUP BY (year(?date) as ?year)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Merci pour ta réponse Sapience. J'ai effectivement vu les fonction year(), month(), etc de SPARQL 1.1, seulement elles ne semblent pas implémentées par Virtuoso ni ARC2.

    Sur quel triplestore as-tu testé ta requête ?

  4. #4
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Sur Sesame.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    ok merci

    A voir du coup ... Sachant que les données en question sont des données mensuelles, il est peut-être plus judicieux de stocker l'information temporelle sous deux prédicats : année et mois, ce qui rend alors très simple les opérations d'agrégation.

    Mais en contrepartie, je perds les éventuelles futures fonctions liées au traitement des dates.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut
    Je reviens sur l’agrégat par année avec ta requête :

    select (year(?date) as ?year) (AVG(?population) as ?average)
    where {
    ?x <http://www.exemple.com/onto/date> ?date .
    ?x <http://www.exemple.com/onto/population> ?population .
    }
    GROUP BY (year(?date) as ?year)
    Si je veux récupérer un MAX(?population) par année, est-il possible de récupérer en même temps la date complète qui est associée à ce max ?

    Je ne trouve pas de solution simple pour faire cela ...

  7. #7
    Membre éprouvé
    Avatar de Sapience
    Homme Profil pro
    Consultant sémantique & data à sparna.fr
    Inscrit en
    Avril 2005
    Messages
    305
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Consultant sémantique & data à sparna.fr
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 305
    Points : 915
    Points
    915
    Par défaut
    Avec une subquery SPARQL 1.1 : sélectionner d'abord le maxPopulation dans la sous-query, puis sélectionner les infos associées à ce maxPopulation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select ?date ?maxPopulation
    where {
    ?x <http://www.exemple.com/onto/date> ?date .
    ?x <http://www.exemple.com/onto/population> ?maxPopulation .
    {
      SELECT (MAX(?population) as ?maxPopulation)
      WHERE {
        ?x <http://www.exemple.com/onto/population> ?population .
      }
    }
    }
    En variant là-dessus tu devrais pouvoir faire ce que tu veux.

Discussions similaires

  1. Recherche sur des dates
    Par jroy dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 09/02/2006, 08h27
  2. [VB6] Requêtes en BDD sur des dates
    Par pom dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/11/2005, 14h04
  3. Index sur des dates?
    Par nicovmd dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 30/06/2005, 14h20
  4. analyse "périodes" basées sur des dates.
    Par Yorglaa dans le forum Oracle
    Réponses: 7
    Dernier message: 22/12/2004, 11h39
  5. Réponses: 9
    Dernier message: 17/01/2004, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo