Bonjour,
j'ai une base de données en PostGreSQL 9.3 qui contient environ 12 millions d'évènements techniques se produisant sur des trains.
Un évènement est défini par :
- un identifiant unique
- un code
- un libellé
- une date d'apparition
- un numéro de train
- n informations complémentaires (température, GPS, sens de marche,....)
Les infos complémentaire sont appelées "param" par la suite.
J'ai par exemple un ensemble d’événements sur le train n°27 :
evt1 : CodeX12, libellé_eventX12, 2015-05-25 12:00:00, train_27, paramA=0 paramB=1 ParamC=0 T°C=19°C
evt2 : CodeX12, libellé_eventX12, 2015-05-25 12:15:00, train_27, paramA=0 paramB=1 ParamC=1 T°C=23°C
evt3 : CodeX98, libellé_eventX98, 2015-05-25 12:15:27, train_27, paramA=1 paramB=0 ParamC=0 T°C=23°C
evt4 : CodeX37, libellé_eventX37, 2015-05-25 12:48:00, train_27, paramA=0 paramB=1 ParamC=0 T°C=45°C
evt5 : CodeX37, libellé_eventX37, 2015-05-25 16:00:00, train_27, paramA=0 paramB=1 ParamC=0 T°C=49°C
Jusque là tout va bien, les données sont stockées dans une base relationnelle avec des index bien placés.
On a 12 millions d'enregistrements et chaque enregistrement possède en moyenne 100 informations complémentaires.
Il y a une application web en PHP qui s'occupe de faire la restitution des données via des requêtes préparées.
Pour aller plus loin dans le traitement des ces informations j'aimerai pouvoir faire de la reconnaissance de pattern pour automatiquement déterminer des écarts de fonctionnement.
Par exemple, la future application web doit me signaler automatiquement les cas suivants :
- CodeX12 répété 2 fois en 20 minutes
- CodeX12 avec (paramA=0 OU paramB=0)ET paramC=0) répété 2 fois en 20 minutes
- CodeX12 suivi du CodeX98 dans les 30 minutes
- CodeX12 avec une T°<25°C suivi du codeX98 avec paramA=1 dans les 30 minutes
- CodeX12 avec une T°<25°C suivi du codeX98 avec paramA=1 dans les 30 minutes, le tout répété 2 fois en 24h
En se creusant les méninges on peut faire des requêtes préparées en SQL qui permettent de répondre à ces pattern mais cela implique que :
- l'application web fige les possibilités mise à dispo des utilisateurs
- chaque événement est daté et on travaille en intervalle de temps donc il faut faire des sous-requêtes SQL pour faire la conversion
- C'est assez difficile d'avoir une application web en php pour la restitution
Quand on regarde la structure des données, la représentation en graphe paraît être la représentation la plus naturelle.
J'ai lu pas mal d'articles sur Neo4j qui me semble être un client sérieux pour la suite de mon projet.
La représentation de mes événements sous forme de graphe est très simple
Se pose alors la question de la représentation d'éléments temporels, avec 2 concepts qui reviennent le plus souvent :
- créer une timeline de type year-month-day-hour-minute-second et attacher chaque événement.
- pour chaque événement ajouter une propriété "Before" ou "After" qui permet de créer la notion de "succession d'événement"
Je n'ai pas encore pris en main la solution Neo4j car j'ai plusieurs questions (mon esprit n'est pas encore prêt pour le NoSQL) :
- Quelle est la modélisation la plus adaptée pour réprésenter la temporalité ?
A priori avec la notion "Before" et en ajoutant le delta de temps entre chaque événement cela semble converger vers mes problèmes de conversion date/intervalle de temps
- peut-on écrire des requêtes CYPHER qui donnent directement le résultat pour mes patterns ? (ceux définis ci-dessus)
- Est ce qu'il y a d'autres solutions que je n'aurai pas envisagé?
- la base de données PostGreSQL va continuer d'être alimentée donc il faut que je prévoie un ETL qui synchronise PostGres et Neo4j. Est ce qu'il y a des outils performant pour le faire?
J'utilise Talend pour d'autres projets
Merci d'avance pour vos réponses.
Thomas






Répondre avec citation
Partager