Précédent   Forum du club des développeurs et IT Pro > Webmasters - Développement Web > Web sémantique > SPARQL
SPARQL Forum d'entraide sur SPARQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/05/2012, 16h37   #1
Neveldo
Invité de passage
 
Inscription : 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 :

Citation:
_: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 !
Neveldo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2012, 17h14   #2
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 190
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 : 190
Points : 681
Points : 681
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)
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2012, 17h25   #3
Neveldo
Invité de passage
 
Inscription : mars 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 46
Points : 3
Points : 3
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 ?
Neveldo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2012, 17h31   #4
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 190
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 : 190
Points : 681
Points : 681
Sur Sesame.
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2012, 17h46   #5
Neveldo
Invité de passage
 
Inscription : mars 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 46
Points : 3
Points : 3
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.
Neveldo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2012, 11h39   #6
Neveldo
Invité de passage
 
Inscription : mars 2008
Messages : 46
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 46
Points : 3
Points : 3
Je reviens sur l’agrégat par année avec ta requête :

Citation:
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 ...
Neveldo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2012, 12h40   #7
Sapience
Membre chevronné
 
Avatar de Sapience
 
Homme Thomas Francart
Consultant sémantique & data à sparna.fr
Inscription : avril 2005
Messages : 190
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 : 190
Points : 681
Points : 681
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.
Sapience est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h14.


 
 
 
 
Partenaires

Hébergement Web