bi

2025-09-10 07:32:05 +02:00
parent 0886ecc42a
commit 2043a7b453
7 changed files with 368 additions and 260 deletions

161
Arbres.md

@@ -13,7 +13,7 @@ Chaque nœud stocke lidentifiant de son parent.
Avantages
- Simple à comprendre.
- Facile à insérer / modifier.
- Facile à insérer et à modifier.
Limites
- Difficile dinterroger plusieurs niveaux sans récursivité.
@@ -35,18 +35,161 @@ CREATE TABLE familles (
└── Accessoires TV
```
###
### Lire la famille de premier niveau
## Nested Sets (modèle densembles imbriqués)
Représentation intervallaire
```sql
SELECT code, famille, code_parent
FROM famille
WHERE code = '02'
```
### Lire les enfants directs du premier niveau
```sql
SELECT code, famille, code_parent
FROM famille
WHERE code_parent = '02'
```
code|famille|parent
---|---|---
02RACINE| **** Racines & Tubercules |02
02CUCURB| **** Cucurbitacées |02
02LEGUM| **** Légumineuses |02
02COMPOS| *** Produits composés |02
02FEUILLE| **** Feuilles et tiges v02
02SOLAN| **** Solanacées |02
02CHAM| Champignons |02
02CHOU| Chou |02
02MAIS| Maïs |02
### Combiner les résultats
```sql
SELECT code, famille, code_parent
FROM famille
WHERE code = '02'
UNION ALL
SELECT code, famille, code_parent
FROM famille
WHERE code_parent = '02'
```
Utiliser la récursivité pour descendre en profondeur
```sql
WITH RECURSIVE famille_parent AS (
SELECT code, famille, code_parent
FROM famille
WHERE code = '01'
UNION ALL
SELECT f.code, f.famille, f.code_parent
FROM famille f
join famille_parent on f.code_parent = famille_parent.code
)
SELECT * FROM famille_parent;
```
### Remonter les familles jusqu'à la racine
```sql
WITH RECURSIVE ancetre AS (
SELECT code, famille, code_parent, 1 AS niveau
FROM famille
WHERE code = '02CUCURB'
UNION ALL
SELECT f.code, f.famille, f.code_parent, a.niveau + 1
FROM famille f
JOIN ancetre a ON a.code_parent = f.code
)
SELECT *
FROM ancetre
ORDER BY niveau DESC; -- de la racine vers le nœud
```
Récupérer la hiérarchie dans une chaine de caractères formatée.
```sql
SELECT string_agg(nom, ' > ' ORDER BY niveau DESC) AS fil_ariane
FROM ancetres;
```
## représentation intervallaire
Le modèle dadjacency list (parent_id) est simple, mais certaines requêtes deviennent complexes, surtout :
- récupérer tous les descendants dun nœud,
- récupérer le chemin complet dun nœud.
La représentation intervallaire ou modèle densembles imbriqués (Nested Sets) résout ce problème en attribuant à chaque nœud deux valeurs entièrement déterministes :
inf (gauche)
sup (droite)
Ces valeurs définissent un intervalle [inf, sup] qui contient tous les descendants du nœud.
### Principe
Chaque nœud reçoit deux nombres (inf et sup) de telle sorte que :
- la racine a lintervalle le plus large [1, 2n] pour n nœuds,
- un enfant est strictement inclus dans lintervalle de son parent,
- aucun nœud na un intervalle qui chevauche celui dun nœud non descendant.
La représentation intervallaire est très efficace pour les lectures darbres complexes. Elle est particulièrement adaptée aux arbres stables. En cas de modifications il faut recalculer les bornes de tous les noeuds.
```sql
SELECT *
FROM famille
WHERE inf BETWEEN 2 AND 7
ORDER BY inf;
```
### Récupérer tous les ancêtres
```sql
SELECT *
FROM familles
WHERE inf <= 5 AND sup >= 6
ORDER BY inf;
```
### Calculer la profondeur
```sql
SELECT COUNT(parent.id) AS profondeur
FROM famille AS node
JOIN famille AS parent
ON parent.inf < node.inf AND parent.sup > node.sup
WHERE node.code = '02CUCURB';
```
## Materialized Path (chemin matérialisé)
Trouver tous les articles descendants dune catégorie
Dans les bases de données relationnelles, représenter une hiérarchie peut être complexe. Les modèles classiques, comme Adjacency List ou Nested Sets, nécessitent des requêtes récursives ou des mises à jour délicates pour récupérer les descendants, ancêtres ou construire un fil dAriane.
PostgreSQL propose lextension ltree, spécialement conçue pour représenter des arborescences de manière simple et efficace. Elle permet de stocker un chemin complet pour chaque nœud et fournit des opérateurs et fonctions pour manipuler ces chemins.
Lextension introduit le type ltree, qui est une chaîne de labels séparés par des points, représentant le chemin depuis la racine jusquau nœud. Chaque segment (label) correspond à un nœud de larbre.
Il représente le chemin complet depuis la racine, ce qui simplifie toutes les opérations sur larbre.
### Trouver toutes les familles descendantes dune catégorie
Utilisation d'un nouvel opérateur `<@`
```sql
SELECT a.name
FROM articles a
JOIN categories c ON a.category_id = c.id
WHERE c.path <@ 'Legumes.Racine';
select famille
FROM famille
WHERE famille.arborescence <@ 'Jardin.Primeur.Legumes';
```
### Trouver toutes les ancetres dune famille
```sql
SELECT f.*
FROM famille f
JOIN famille cible ON cible.code = '02POTIR'
WHERE f.arborescence @> cible.arborescence
ORDER BY nlevel(f.arborescence);
```

11
Home.md

@@ -8,6 +8,8 @@
- [Vues et fonctions](View.md)
- [Fonctions de fenêtrage](window.md)
- [Colonnes calculées](Calculated.md)
- [Business Intelligence](datawarehouse.md)
- [Les modèles de données](models.md)
- [Intervalles](intervalle.md)
- [Arbres](Arbres.md)
- [Données spatiales](Spatial.md)
@@ -45,6 +47,15 @@ group by mois --date_trunc('month', date_ticket)
- Afficher pour chaque adhérent la date et le montant de son dernier ticket. [voir](sousrequete.md#laterals).
## Séance 2
- Calculer le chiffre d'affaire par jour de la semaine. Quel est le jour où il y a plus de vente ?
- Ajouter une colonne calculée à la table adhérent pour calculer l'age de l'adhérent
- Créer une vue materialisée de type flat table contenant les toutes informations des tickets
- Analyser le total des ventes par mois
Arrondir les montant à deux chiffres après la virgule.

@@ -112,7 +112,6 @@ where famille.code is null
Attention ! La valeur `null` ne peut être comparée à rien. L'égalité avec null retourne ni vrai ni faux mais null. Ainsi null n'est pas égal à null. Pour la comparaison avec null il faut utiliser les mots-clés `is` ou `is not`.
## Jointure croisée ou produit cartésien
La jointure croisée renvoie le produit cartésien des deux tables. Chaque ligne de la première table est combinée avec chaque ligne de la deuxième table. Cela produit un très grand nombre de lignes de résultat.

57
arbre/autojointure.svg Normal file

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="696pt"
height="1021pt"
viewBox="0 0 696 1021"
version="1.1"
id="svg335"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs>
<marker
id="arrow"
viewBox="0 0 10 10"
refX="5"
refY="5"
markerWidth="9"
markerHeight="9"
orient="auto-start-reverse">
<path d="M 0 0 L 10 5 L 0 10 z" />
</marker>
<style>
.vertex {
fill:#efefef;
stroke:#000000;
stroke-width:2;
}
</style>
</defs>
<circle class="vertex" cx="390" cy="55" r="50" />
<circle class="vertex" cx="130" cy="235" r="50" />
<circle class="vertex" cx="390" cy="235" r="50" />
<circle class="vertex" cx="630" cy="235" r="50" />
<circle class="vertex" cx="60" cy="370" r="50" />
<circle class="vertex" cx="190" cy="370" r="50" />
<circle class="vertex" cx="320" cy="370" r="50" />
<circle class="vertex" cx="450" cy="370" r="50" />
<circle class="vertex" cx="630" cy="370" r="50" />
<circle class="vertex" cx="450" cy="530" r="50" />
<circle class="vertex" cx="630" cy="530" r="50" />
<circle class="vertex" cx="450" cy="680" r="50" />
<circle class="vertex" cx="530" cy="820" r="50" />
<circle class="vertex" cx="370" cy="820" r="50" />
<circle class="vertex" cx="530" cy="960" r="50" />
<line x1="140" y1="178" x2="347" y2="85" stroke="#000" stroke-width="1.5" marker-end="url(#arrow)" />
<text x="400" y="61" font-size="25" text-anchor="middle">1</text>
<text x="400" y="241" font-size="25" text-anchor="middle">3</text>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

64
datawarehouse.md Normal file

@@ -0,0 +1,64 @@
---
title: Entrepôts de données
---
Un data warehouse, ou entrepôt de données, est un système de gestion de base de données conçu pour stocker, consolider et organiser de grandes quantités de données provenant de sources multiples en vue dune analyse et dun reporting. Il sert de référentiel centralisé où les données sont structurées de manière à faciliter la prise de décision et les analyses historiques dans les entreprises.
- **Centralisation des données** : Un data warehouse intègre des données provenant de différentes sources (bases de données opérationnelles, ERP, CRM, fichiers externes, etc.). Ces données sont rassemblées dans un seul et même endroit pour un accès facilité et une vision globale des informations.
- **Historisation des données** : Contrairement aux bases de données transactionnelles, qui stockent des données en temps réel ou à court terme, un data warehouse contient des données historiques. Il permet donc danalyser des tendances et deffectuer des prévisions basées sur plusieurs années dinformations.
- **Optimisation pour l'analyse** : Les données dans un data warehouse sont structurées de manière à faciliter les requêtes analytiques complexes. Elles sont souvent organisées selon un modèle multidimensionnel (modèle étoile ou flocon) pour permettre une analyse rapide et facile à travers divers axes (produits, clients, régions, temps, etc.).
- **Extraction, Transformation, Chargement (ETL)** : Les données intégrées dans un data warehouse passent par un processus ETL :
- **Extraction** : Les données sont extraites des différentes sources.
- **Transformation** : Les données sont nettoyées, agrégées et transformées pour être cohérentes entre elles.
- **Chargement** : Les données transformées sont ensuite chargées dans le data warehouse.
- **Non volatile** : Une fois les données intégrées dans lentrepôt de données, elles ne sont pas modifiées ou mises à jour, contrairement aux bases de données opérationnelles. Cela permet d'assurer une intégrité historique des informations pour des analyses fiables.
- **Orienté sujet**: Les data warehouses sont souvent organisés par thème ou sujet dintérêt. Par exemple, un entrepôt de données peut avoir des sections dédiées aux ventes, aux finances, ou à la logistique. Cela permet aux utilisateurs d'accéder directement aux données pertinentes pour leurs besoins.
## Architecture d'un data warehouse
### Sources de données
Des données proviennent de différentes applications et bases de données (systèmes transactionnels, feuilles Excel, ERP, CRM, etc.).
### Processus ETL
Ce processus assure la transformation et lintégration des données. Il comprend lextraction des données des systèmes sources, leur nettoyage, la gestion des incohérences, lintégration et le chargement dans lentrepôt.
### Entrepôt de données
Il s'agit de la base de données centralisée où les données sont stockées de manière structurée pour faciliter lanalyse.
### Outils d'accès et d'analyse
Les utilisateurs peuvent accéder aux données du data warehouse via des outils de Business Intelligence (BI) comme des tableaux de bord, des rapports, ou des outils de requête SQL.
## Avantages d'un data warehouse
- Consolidation des données : Il centralise les données provenant de diverses sources, ce qui permet une vision globale et cohérente de l'entreprise.
- Analyse historique : Les données historiques stockées dans le data warehouse permettent d'identifier des tendances et de prendre des décisions stratégiques éclairées.
- Amélioration des performances analytiques : Les entrepôts de données sont conçus pour optimiser les requêtes analytiques complexes, ce qui les rend plus rapides et efficaces que les bases de données transactionnelles.
- Fiabilité et intégrité des données : Les processus ETL garantissent que les données sont nettoyées, transformées et harmonisées avant dêtre chargées dans lentrepôt, réduisant ainsi les risques derreurs.
## Exemples d'utilisation d'un data warehouse
- Analyse des ventes : Une entreprise peut utiliser un data warehouse pour analyser les tendances de vente sur plusieurs années, en segmentant les données par produit, région, ou période.
- Prévision financière : Un entrepôt de données peut aider à compiler et à analyser des données financières provenant de différents services pour prévoir les performances futures.
- Optimisation des opérations : En agrégeant des données de production, de logistique et de ventes, un data warehouse permet doptimiser les chaînes d'approvisionnement et les processus opérationnels.
Dans le cadre de la Business Intelligence (BI) et plus précisément dans la conception des entrepôts de données, les tables de faits et les tables de dimensions sont des concepts centraux du modèle en étoile ou modèle multidimensionnel.
## Tables de faits
Une table de faits est au cœur d'un entrepôt de données. Elle stocke des données **quantitatives** ou **mesurables** liées aux événements d'une entreprise. Ces événements sont souvent des transactions ou des interactions importantes que l'entreprise souhaite analyser. Les données de la table de faits représentent des **mesures chiffrées** (par exemple, ventes, revenus, quantité vendue, etc.), qui sont généralement utilisées pour l'analyse et l'évaluation des performances.
Caractéristiques d'une table de faits :
- **Granularité** : Chaque ligne de la table représente un événement unique ou une transaction. La granularité définit le niveau de détail des faits (par exemple, un enregistrement par jour, par produit, par client, etc.).
- **Mesures** : Les colonnes de la table de faits contiennent les mesures numériques (chiffres de vente, quantités, coûts, bénéfices, etc.).
- **Clés étrangères** : Les tables de faits contiennent des clés étrangères qui se réfèrent aux clés primaires des tables de dimensions. Ces clés permettent de relier les faits aux informations contextuelles (produit, temps, client).
## Tables de dimensions
Les tables de dimensions fournissent des informations **qualitatives** ou **descriptives** qui donnent un contexte aux données stockées dans les tables de faits. Elles ne contiennent généralement pas de mesures, mais des **attributs** qui décrivent les faits. Par exemple, dans une analyse des ventes, les dimensions pourraient être le produit, le client, ou le temps.
## Relation entre les tables de faits et les tables de dimensions
La relation entre les tables de faits et de dimensions se fait par des clés étrangères. Par exemple, une vente spécifique (enregistrée dans la table de faits) est liée à un produit précis, un client spécifique et une date donnée (enregistrés dans les tables de dimensions correspondantes). Cela permet de construire des analyses détaillées, telles que les ventes par produit, par période de temps ou par région.
Les tables de dimensions apportent le **contexte descriptif** nécessaire pour analyser ces données.

84
models.md Normal file

@@ -0,0 +1,84 @@
---
title: Modèles de données
---
Il existe deux (trois) modèles principaux, le modèle étoile (star) et le modèle flocon (snowflake). Ils sont utilisés dans les entrepôts de données pour organiser les données de manière à **faciliter** les analyses multidimensionnelles, particulièrement dans les systèmes de Business Intelligence (BI). Ces modèles se distinguent par la manière dont les tables de faits et les tables de dimensions sont structurées et reliées entre elles.
## Modèle étoile (Star Schema)
Le modèle en étoile est une structure simple où une table de faits est reliée **directement** à plusieurs tables de dimensions. Il est appelé "étoile" parce que la table de faits est au centre, et les tables de dimensions sont organisées autour delle, formant ainsi une structure qui ressemble à une étoile.
### Caractéristiques du modèle étoile :
- **Simplicité** : Les tables de dimensions ne sont pas normalisées, cest-à-dire quelles peuvent contenir des données redondantes ou dupliquées.
- **Accès rapide** : Comme les tables de dimensions sont dénormalisées (les données sont centralisées et répétées), les requêtes sont plus simples et plus rapides à exécuter. Il y a moins de jointures à réaliser
- **Lisibilité** : Le modèle est simple à comprendre et à concevoir, car il n'y a qu'une seule relation directe entre la table de faits et chaque table de dimension. Idéal pour des besoins analytiques simples avec de grandes quantités de données.
## Modèle flocon (Snowflake Schema)
Le modèle flocon est une extension du modèle étoile. Dans ce modèle, certaines ou toutes les tables de dimensions sont **normalisées**, cest-à-dire qu'elles sont subdivisées en plusieurs sous-tables pour éliminer les redondances. Le modèle est appelé "flocon" parce que la structure résultante a une forme plus complexe, semblable à celle d'un flocon de neige.
### Caractéristiques du modèle flocon
- **Normalisation** : Les tables de dimensions sont divisées en plusieurs sous-tables pour éliminer les données redondantes. Chaque sous-table représente une dimension spécifique.
- **Complexité** : Les requêtes sont plus complexes à écrire et prennent plus de temps à s'exécuter car elles impliquent plusieurs jointures entre les tables de dimensions et sous-tables.
- **Réduction de la redondance** : Le modèle flocon réduit la redondance des données dans les dimensions. Les tables étant normalisées, les données redondantes sont éliminées, ce qui réduit la taille des tables.
#### Inconvénients
- **Requêtes plus lentes** : Le modèle flocon nécessite des jointures supplémentaires entre les tables, ce qui peut ralentir lexécution des requêtes.
- **Complexité accrue** : La structure est plus complexe à comprendre et à concevoir par rapport au modèle étoile.
## Table aplatie (flat table)
Tout est regroupé dans une seule table large.
Exemple : une seule table qui contient directement Produit, Sous-famille, Famille, Client, Date, etc.
Avantage : très simple pour les outils BI et le reporting.
Il existe deux (trois) modèles principaux, le modèle étoile (star) et le modèle flocon (snowflake). Ils sont utilisés dans les entrepôts de données pour organiser les données de manière à **faciliter** les analyses multidimensionnelles, particulièrement dans les systèmes de Business Intelligence (BI). Ces modèles se distinguent par la manière dont les tables de faits et les tables de dimensions sont structurées et reliées entre elles.
## Modèle étoile (Star Schema)
Le modèle en étoile est une structure simple où une table de faits est reliée **directement** à plusieurs tables de dimensions. Il est appelé "étoile" parce que la table de faits est au centre, et les tables de dimensions sont organisées autour delle, formant ainsi une structure qui ressemble à une étoile.
### Caractéristiques du modèle étoile :
- **Simplicité** : Les tables de dimensions ne sont pas normalisées, cest-à-dire quelles peuvent contenir des données redondantes ou dupliquées.
- **Accès rapide** : Comme les tables de dimensions sont dénormalisées (les données sont centralisées et répétées), les requêtes sont plus simples et plus rapides à exécuter. Il y a moins de jointures à réaliser
- **Lisibilité** : Le modèle est simple à comprendre et à concevoir, car il n'y a qu'une seule relation directe entre la table de faits et chaque table de dimension. Idéal pour des besoins analytiques simples avec de grandes quantités de données.
## Modèle flocon (Snowflake Schema)
Le modèle flocon est une extension du modèle étoile. Dans ce modèle, certaines ou toutes les tables de dimensions sont **normalisées**, cest-à-dire qu'elles sont subdivisées en plusieurs sous-tables pour éliminer les redondances. Le modèle est appelé "flocon" parce que la structure résultante a une forme plus complexe, semblable à celle d'un flocon de neige.
### Caractéristiques du modèle flocon
- **Normalisation** : Les tables de dimensions sont divisées en plusieurs sous-tables pour éliminer les données redondantes. Chaque sous-table représente une dimension spécifique.
- **Complexité** : Les requêtes sont plus complexes à écrire et prennent plus de temps à s'exécuter car elles impliquent plusieurs jointures entre les tables de dimensions et sous-tables.
- **Réduction de la redondance** : Le modèle flocon réduit la redondance des données dans les dimensions. Les tables étant normalisées, les données redondantes sont éliminées, ce qui réduit la taille des tables.
#### Inconvénients
- **Requêtes plus lentes** : Le modèle flocon nécessite des jointures supplémentaires entre les tables, ce qui peut ralentir lexécution des requêtes.
- **Complexité accrue** : La structure est plus complexe à comprendre et à concevoir par rapport au modèle étoile.
## Table aplatie (flat table)
Tout est regroupé dans une seule table large.
Exemple : une seule table qui contient directement Produit, Sous-famille, Famille, Client, Date, etc.
Avantage : très simple pour les outils BI et le reporting.
#### Inconvénients
- beaucoup de redondance,
- consommation despace,
- difficile à maintenir.
#### Inconvénients
- beaucoup de redondance,
- consommation despace,
- difficile à maintenir.

@@ -1,250 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="696pt"
height="1021pt"
viewBox="0 0 696 1021"
version="1.1"
id="svg335"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
>
<style>
.vertex {
fill:#efefef;
stroke:#000000;
stroke-width:2;
}
</style>
</defs>
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 15.85314 5.256093 C 15.85314 6.712733 14.67228 7.893593 13.21564 7.893593 C 11.758999 7.893593 10.57814 6.712733 10.57814 5.256093 C 10.57814 3.799452 11.758999 2.618593 13.21564 2.618593 C 14.67228 2.618593 15.85314 3.799452 15.85314 5.256093 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path52" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 3.267202 13.585194 C 3.267202 15.099843 2.039468 16.327772 0.524819 16.327772 C -0.989829 16.327772 -2.217759 15.099843 -2.217759 13.585194 C -2.217759 12.070546 -0.989829 10.842616 0.524819 10.842616 C 2.039468 10.842616 3.267202 12.070546 3.267202 13.585194 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path62" />
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 15.819741 14.202772 C 15.819741 15.66078 14.63771 16.842616 13.179702 16.842616 C 11.721694 16.842616 10.539858 15.66078 10.539858 14.202772 C 10.539858 12.744569 11.721694 11.562733 13.179702 11.562733 C 14.63771 11.562733 15.819741 12.744569 15.819741 14.202772 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path72" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 28.312319 14.720155 C 28.312319 16.25414 27.068765 17.497694 25.53478 17.497694 C 24.000796 17.497694 22.757241 16.25414 22.757241 14.720155 C 22.757241 13.186171 24.000796 11.942616 25.53478 11.942616 C 27.068765 11.942616 28.312319 13.186171 28.312319 14.720155 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path82" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 0.524819 10.842616 L 10.890054 7.27953 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path92" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 11.244741 7.157655 L 10.85314 7.556679 L 10.890054 7.27953 L 10.690444 7.083827 Z M 11.244741 7.157655 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path94" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 13.179702 11.562733 L 13.210952 8.380311 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path96" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 13.214468 8.005311 L 13.459585 8.50785 L 13.210952 8.380311 L 12.959585 8.502968 Z M 13.214468 8.005311 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path98" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 25.53478 11.942616 L 15.522866 7.325233 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path100" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 15.182436 7.168202 L 15.74103 7.150624 L 15.522866 7.325233 L 15.531655 7.60453 Z M 15.182436 7.168202 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path102" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M -0.427329 21.213515 C -0.427329 22.728163 -1.655064 23.956093 -3.169712 23.956093 C -4.68436 23.956093 -5.91229 22.728163 -5.91229 21.213515 C -5.91229 19.698866 -4.68436 18.470936 -3.169712 18.470936 C -1.655064 18.470936 -0.427329 19.698866 -0.427329 21.213515 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path104" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 5.935366 21.415077 C 5.935366 22.929725 4.707632 24.15746 3.192983 24.15746 C 1.678335 24.15746 0.450405 22.929725 0.450405 21.415077 C 0.450405 19.900429 1.678335 18.672499 3.192983 18.672499 C 4.707632 18.672499 5.935366 19.900429 5.935366 21.415077 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path116" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M -3.169712 18.470936 L -1.663853 15.943007 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path128" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M -1.47186 15.620741 L -1.513071 16.178163 L -1.663853 15.943007 L -1.942564 15.922304 Z M -1.47186 15.620741 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path130" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 3.192983 18.672499 L 2.574038 15.998866 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path132" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 2.489468 15.633632 L 2.845718 16.064296 L 2.574038 15.998866 L 2.358608 16.177186 Z M 2.489468 15.633632 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path134" />
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 19.464468 21.170741 C 19.464468 22.715858 18.211929 23.968202 16.667007 23.968202 C 15.12189 23.968202 13.869351 22.715858 13.869351 21.170741 C 13.869351 19.625819 15.12189 18.37328 16.667007 18.37328 C 18.211929 18.37328 19.464468 19.625819 19.464468 21.170741 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path136" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 16.667007 18.37328 L 15.326772 16.467811 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path150" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 15.111147 16.161171 L 15.60314 16.42621 L 15.326772 16.467811 L 15.194155 16.713905 Z M 15.111147 16.161171 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path152" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 12.652749 21.2391 C 12.652749 22.784022 11.400405 24.036561 9.855288 24.036561 C 8.310366 24.036561 7.057827 22.784022 7.057827 21.2391 C 7.057827 19.693983 8.310366 18.44164 9.855288 18.44164 C 11.400405 18.44164 12.652749 19.693983 12.652749 21.2391 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path154" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 9.855288 18.44164 L 11.057827 16.484413 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path168" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 11.254311 16.164882 L 11.205483 16.721913 L 11.057827 16.484413 L 10.779507 16.459999 Z M 11.254311 16.164882 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path170" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 28.574429 22.232655 C 28.574429 23.777772 27.32189 25.030116 25.776968 25.030116 C 24.231851 25.030116 22.979507 23.777772 22.979507 22.232655 C 22.979507 20.687733 24.231851 19.435194 25.776968 19.435194 C 27.32189 19.435194 28.574429 20.687733 28.574429 22.232655 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path172" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 28.629507 29.792616 C 28.629507 31.337733 27.376968 32.590077 25.831851 32.590077 C 24.286929 32.590077 23.03439 31.337733 23.03439 29.792616 C 23.03439 28.247694 24.286929 26.995155 25.831851 26.995155 C 27.376968 26.995155 28.629507 28.247694 28.629507 29.792616 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path186" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 25.63146 19.38871 L 25.559585 17.983827 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path202" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 25.540444 17.609413 L 25.81564 18.095936 L 25.559585 17.983827 L 25.316421 18.121522 Z M 25.540444 17.609413 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path204" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 25.831851 26.995155 L 25.79064 25.516835 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path206" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 25.780093 25.141835 L 26.04396 25.634804 L 25.79064 25.516835 L 25.544155 25.648671 Z M 25.780093 25.141835 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path208" />
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 19.469741 29.531679 C 19.469741 31.076796 18.217202 32.32914 16.672085 32.32914 C 15.127163 32.32914 13.874624 31.076796 13.874624 29.531679 C 13.874624 27.986757 15.127163 26.734218 16.672085 26.734218 C 18.217202 26.734218 19.469741 27.986757 19.469741 29.531679 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path210" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 16.672085 26.734218 L 16.667788 24.455116 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path226" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 16.667202 24.080116 L 16.918179 24.57953 L 16.667788 24.455116 L 16.418179 24.580507 Z M 16.667202 24.080116 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path228" />
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 19.674624 36.709804 C 19.674624 38.254725 18.422085 39.507265 16.877163 39.507265 C 15.332046 39.507265 14.079702 38.254725 14.079702 36.709804 C 14.079702 35.164686 15.332046 33.912343 16.877163 33.912343 C 18.422085 33.912343 19.674624 35.164686 19.674624 36.709804 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path230" />
<path
style="fill-rule:evenodd;fill:#afdde9;fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%, 0%, 0%);stroke-opacity:1;stroke-miterlimit:10"
d="M 14.471304 43.4016 C 14.471304 44.946718 13.218765 46.199257 11.673843 46.199257 C 10.128726 46.199257 8.876382 44.946718 8.876382 43.4016 C 8.876382 41.856679 10.128726 40.60414 11.673843 40.60414 C 13.218765 40.60414 14.471304 41.856679 14.471304 43.4016 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path248" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 22.085171 43.54789 C 22.085171 45.092811 20.832632 46.34535 19.287515 46.34535 C 17.742593 46.34535 16.490054 45.092811 16.490054 43.54789 C 16.490054 42.002968 17.742593 40.750429 19.287515 40.750429 C 20.832632 40.750429 22.085171 42.002968 22.085171 43.54789 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path270" />
<path
style="fill-rule:evenodd;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 22.299233 50.594374 C 22.299233 52.139296 21.046694 53.391835 19.501577 53.391835 C 17.956655 53.391835 16.704116 52.139296 16.704116 50.594374 C 16.704116 49.049257 17.956655 47.796718 19.501577 47.796718 C 21.046694 47.796718 22.299233 49.049257 22.299233 50.594374 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path292" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 16.877163 33.912343 L 16.734585 32.811952 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path318" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 16.686538 32.440077 L 16.998647 32.903749 L 16.734585 32.811952 L 16.502749 32.968007 Z M 16.686538 32.440077 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path320" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 11.673843 40.60414 L 14.480288 38.936757 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path322" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 14.802554 38.74535 L 14.500405 39.215663 L 14.480288 38.936757 L 14.245132 38.78578 Z M 14.802554 38.74535 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path324" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 19.287515 40.750429 L 18.955288 39.164686 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path326" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 18.87853 38.797694 L 19.225601 39.23578 L 18.955288 39.164686 L 18.736343 39.338319 Z M 18.87853 38.797694 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path328" />
<path
style="fill:none;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 19.501577 47.796718 L 19.358608 46.826991 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path330" />
<path
style="fill-rule:evenodd;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;"
d="M 19.303921 46.456093 L 19.624233 46.9141 L 19.358608 46.826991 L 19.129507 46.987147 Z M 19.303921 46.456093 "
transform="matrix(20,0,0,20,121.245802,-49.371853)"
id="path332" />
<circle class="vertex" cx="400" cy="55" r="50" />
<text x="400" y="61" font-size="25" text-anchor="middle">1</text>
<circle class="vertex" cx="400" cy="235" r="50" />
<circle class="vertex" cx="400" cy="966" r="50" />
<circle class="vertex" cx="400" cy="688" r="50" />
<circle class="vertex" cx="400" cy="826" r="50" />
<circle class="vertex" cx="400" cy="380" r="50" />
<circle class="vertex" cx="400" cy="538" r="50" />
<text x="400" y="241" font-size="25" text-anchor="middle">3</text>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB