Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 46
    Points : 3
    Points
    3

    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 chevronné
    Avatar de Sapience
    Homme Profil pro Thomas Francart
    Consultant sémantique & data à sparna.fr
    Inscrit en
    avril 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Francart
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : avril 2005
    Messages : 235
    Points : 708
    Points
    708

    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 :
    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
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 46
    Points : 3
    Points
    3

    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 chevronné
    Avatar de Sapience
    Homme Profil pro Thomas Francart
    Consultant sémantique & data à sparna.fr
    Inscrit en
    avril 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Francart
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : avril 2005
    Messages : 235
    Points : 708
    Points
    708

    Par défaut

    Sur Sesame.

  5. #5
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 46
    Points : 3
    Points
    3

    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
    Invité de passage
    Inscrit en
    mars 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : mars 2008
    Messages : 46
    Points : 3
    Points
    3

    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 chevronné
    Avatar de Sapience
    Homme Profil pro Thomas Francart
    Consultant sémantique & data à sparna.fr
    Inscrit en
    avril 2005
    Messages
    235
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Francart
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : avril 2005
    Messages : 235
    Points : 708
    Points
    708

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •