ExpandProject est un outil d'import de données dans Neo4j avec support de modèles de données définis en XML et validation automatique.
- Modèles de données XML : Définissez vos types d'objets et de liens
- Validation automatique : Validez vos données avant l'import
- Import Neo4j : Import direct dans une base Neo4j
- Types de données : Support STRING, INTEGER, DOUBLE, BOOLEAN, DATE
- Attributs optionnels/obligatoires : Contraintes de validation
- Liens orientés/non-orientés : Flexibilité dans la modélisation
- Java 17+ (OpenJDK 17 ou supérieur)
- Maven 3.8+ (pour la compilation)
- Neo4j (pour l'import de données)
- Version recommandée: 5.x
- Mode serveur accessible via Bolt (bolt://localhost:7687)
git clone https://github.com/TraXXX86/ExpandProject.git
cd ExpandProjectmvn clean installCette commande va :
- Compiler tous les modules (commons, importdata, model)
- Générer les DTOs à partir des schémas XSD
- Créer les JARs dans les dossiers
target/
Une interface locale Vue 3 + Vuetify est disponible dans le dossier ui/.
cd ui
npm install
npm run devL'interface consomme l'API d'import pour charger les modèles et données dans Neo4j, puis afficher uniquement ce qui est stocké en base.
Pour démarrer l'API :
mvn -pl importdata -am package
java -jar importdata/target/expandproject-importdata.jar --api 8080Par défaut l'IHM cible http://localhost:8080. Vous pouvez surcharger via VITE_API_BASE.
Pour lancer Neo4j + API + IHM sans installer Java localement :
docker compose up --buildAccès :
- IHM : http://localhost:5173
- API : http://localhost:8080
- Neo4j : http://localhost:7474 (bolt 7687)
Le mot de passe par défaut est neo4j/expand123456. Vous pouvez modifier cette valeur dans docker-compose.yml.
./scripts/smoke-api.shVous pouvez surcharger l'URL de l'API et le fichier modèle :
API_BASE=http://localhost:8080 MODEL_FILE=chemin/vers/model.xml ./scripts/smoke-api.shSur Ubuntu/Debian:
wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.com stable latest' | sudo tee /etc/apt/sources.list.d/neo4j.list
sudo apt-get update
sudo apt-get install neo4jSur macOS:
brew install neo4jAvec Docker:
docker run -d \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/expand \
neo4j:5.17.0# Avec systemd (Linux)
sudo systemctl start neo4j
# Avec Homebrew (macOS)
neo4j start
# Vérifier le statut
neo4j statusPar défaut, l'application utilise :
- URL:
bolt://localhost:7687 - Utilisateur:
neo4j - Mot de passe:
expand
Pour modifier ces paramètres, éditez :
importdata/src/main/java/fr/expand/project/importdata/dao/connectors/impl/CypherConnector.java(ligne 35)
Vous pouvez aussi surcharger via variables d'environnement ou propriétés JVM :
NEO4J_BOLT_URI(ex:bolt://localhost:7687)NEO4J_HTTP_URI(ex:jdbc:neo4j:http://localhost:7474)NEO4J_USER/NEO4J_PASSWORDNEO4J_AUTH(formatutilisateur/motdepasse, ounone)
Testez rapidement avec les données d'exemple incluses :
cd importdata
mvn exec:java -Dexec.mainClass="fr.expand.project.importdata.Launcher" -Dexec.args="--example"Ceci va :
- Charger le modèle "Réseau Social" (PERSONNE, ENTREPRISE, COMPETENCE)
- Valider les données d'exemple
- Afficher le résultat de validation
cd importdata
mvn exec:java -Dexec.mainClass="fr.expand.project.importdata.Launcher" \
-Dexec.args="src/main/resources/model/example_social_network_model.xml src/main/resources/datapack/example_social_network_data.xml"Ceci va :
- Charger votre modèle
- Valider vos données
- Importer dans Neo4j si la validation réussit
cd importdata
mvn exec:java -Dexec.mainClass="fr.expand.project.importdata.Launcher" \
-Dexec.args="path/to/model.xml path/to/data.xml --validate-only"# Compiler le JAR exécutable
cd importdata
mvn package
# Exécuter
java -jar target/importpackage-0.0.1-SNAPSHOT.jar --example
java -jar target/importpackage-0.0.1-SNAPSHOT.jar model.xml data.xml
java -jar target/importpackage-0.0.1-SNAPSHOT.jar model.xml data.xml --validate-onlyDéfinit les types d'objets et de liens autorisés :
<?xml version="1.0" encoding="UTF-8"?>
<DATA_MODEL NAME="MonModele" VERSION="1.0">
<OBJECT_TYPES>
<OBJECT_TYPE NAME="PERSONNE" ICON="person">
<DESCRIPTION>Représente une personne</DESCRIPTION>
<ATTRIBUTE_DEFINITIONS>
<ATTRIBUTE_DEFINITION NAME="NOM" TYPE="STRING" REQUIRED="true">
<DESCRIPTION>Nom de famille</DESCRIPTION>
</ATTRIBUTE_DEFINITION>
<ATTRIBUTE_DEFINITION NAME="AGE" TYPE="INTEGER" REQUIRED="false"/>
<ATTRIBUTE_DEFINITION NAME="EMAIL" TYPE="STRING" REQUIRED="false"/>
</ATTRIBUTE_DEFINITIONS>
</OBJECT_TYPE>
<OBJECT_TYPE NAME="ENTREPRISE" ICON="apartment">
<DESCRIPTION>Représente une entreprise</DESCRIPTION>
<ATTRIBUTE_DEFINITIONS>
<ATTRIBUTE_DEFINITION NAME="NOM" TYPE="STRING" REQUIRED="true"/>
<ATTRIBUTE_DEFINITION NAME="SECTEUR" TYPE="STRING" REQUIRED="false"/>
</ATTRIBUTE_DEFINITIONS>
</OBJECT_TYPE>
</OBJECT_TYPES>
<LINK_TYPES>
<LINK_TYPE NAME="TRAVAILLE_POUR" DIRECTED="true">
<DESCRIPTION>Relation d'emploi</DESCRIPTION>
<SOURCE_TYPES>
<TYPE_REF NAME="PERSONNE"/>
</SOURCE_TYPES>
<TARGET_TYPES>
<TYPE_REF NAME="ENTREPRISE"/>
</TARGET_TYPES>
<ATTRIBUTE_DEFINITIONS>
<ATTRIBUTE_DEFINITION NAME="POSTE" TYPE="STRING" REQUIRED="false"/>
<ATTRIBUTE_DEFINITION NAME="DATE_DEBUT" TYPE="DATE" REQUIRED="false"/>
</ATTRIBUTE_DEFINITIONS>
</LINK_TYPE>
<LINK_TYPE NAME="CONNAIT" DIRECTED="false">
<DESCRIPTION>Relation de connaissance</DESCRIPTION>
<SOURCE_TYPES>
<TYPE_REF NAME="PERSONNE"/>
</SOURCE_TYPES>
<TARGET_TYPES>
<TYPE_REF NAME="PERSONNE"/>
</TARGET_TYPES>
</LINK_TYPE>
</LINK_TYPES>
</DATA_MODEL>Contient les données à importer :
<?xml version="1.0" encoding="UTF-8"?>
<DATAS>
<OBJECTS>
<OBJECT TYPE="PERSONNE" ID="1">
<ATTRIBUTE KEY="NOM" VALUE="Dupont"/>
<ATTRIBUTE KEY="AGE" VALUE="35"/>
<ATTRIBUTE KEY="EMAIL" VALUE="jean.dupont@email.com"/>
</OBJECT>
<OBJECT TYPE="PERSONNE" ID="2">
<ATTRIBUTE KEY="NOM" VALUE="Martin"/>
<ATTRIBUTE KEY="AGE" VALUE="28"/>
</OBJECT>
<OBJECT TYPE="ENTREPRISE" ID="10">
<ATTRIBUTE KEY="NOM" VALUE="TechCorp"/>
<ATTRIBUTE KEY="SECTEUR" VALUE="Informatique"/>
</OBJECT>
</OBJECTS>
<LINKS>
<LINK TYPE="TRAVAILLE_POUR">
<ATTRIBUTE KEY="POSTE" VALUE="Développeur"/>
<ATTRIBUTE KEY="DATE_DEBUT" VALUE="2020-01-15"/>
<OBJ_LINK_A ID="1" TYPE="PERSONNE"/>
<OBJ_LINK_B ID="10" TYPE="ENTREPRISE"/>
</LINK>
<LINK TYPE="CONNAIT">
<OBJ_LINK_A ID="1" TYPE="PERSONNE"/>
<OBJ_LINK_B ID="2" TYPE="PERSONNE"/>
</LINK>
</LINKS>
</DATAS>| Type | Description | Exemple |
|---|---|---|
STRING |
Chaîne de caractères | "Jean Dupont" |
INTEGER |
Nombre entier | 42 |
DOUBLE |
Nombre décimal | 3.14 |
BOOLEAN |
Booléen | true, false |
DATE |
Date au format ISO | 2020-01-15 |
ExpandProject/
├── commons/ # Classes communes
│ └── src/main/java/
│ └── fr/expand/project/commons/
│ ├── IConstantUtils.java
│ ├── ObjectTypeEnum.java
│ └── LinkTypeEnum.java
│
├── importdata/ # Module principal d'import
│ ├── src/main/java/
│ │ └── fr/expand/project/importdata/
│ │ ├── api/ # API d'import
│ │ ├── dao/ # Connecteurs DB
│ │ ├── dto/ # DTOs générés
│ │ ├── model/ # Gestion des modèles
│ │ ├── validation/ # Validation des données
│ │ ├── util/ # Utilitaires
│ │ └── Launcher.java # Point d'entrée
│ │
│ └── src/main/resources/
│ ├── model/ # Schémas et exemples de modèles
│ │ ├── model.xsd # Schéma XSD du modèle
│ │ └── example_social_network_model.xml
│ └── datapack/ # Schémas et exemples de données
│ ├── data.xsd # Schéma XSD des données
│ └── example_social_network_data.xml
│
├── model/ # Module modèle (vide pour l'instant)
└── pom.xml # Configuration Maven parent
mvn test- Créez votre modèle XML dans
importdata/src/main/resources/model/my_model.xml - Créez vos données XML dans
importdata/src/main/resources/datapack/my_data.xml - Lancez la validation :
cd importdata
mvn exec:java -Dexec.mainClass="fr.expand.project.importdata.Launcher" \
-Dexec.args="src/main/resources/model/my_model.xml src/main/resources/datapack/my_data.xml --validate-only"Après l'import, visualisez vos données :
- Ouvrez Neo4j Browser : http://localhost:7474
- Connectez-vous (neo4j/expand)
- Exécutez des requêtes Cypher :
// Voir tous les noeuds
MATCH (n) RETURN n LIMIT 100
// Voir toutes les relations
MATCH (a)-[r]->(b) RETURN a, r, b LIMIT 100
// Rechercher une personne spécifique
MATCH (p:PERSONNE {NOM: "Dupont"}) RETURN p
// Voir toutes les personnes et leurs entreprises
MATCH (p:PERSONNE)-[r:TRAVAILLE_POUR]->(e:ENTREPRISE)
RETURN p.NOM, r.POSTE, e.NOMSolution : Assurez-vous de fournir un fichier de modèle valide en premier argument.
Solution : Vérifiez que Neo4j est démarré :
neo4j status
# Si arrêté :
sudo systemctl start neo4j # Linux
neo4j start # macOSSolution : Modifiez le mot de passe dans le code ou réinitialisez Neo4j :
neo4j-admin set-initial-password expandSolution : Assurez-vous d'utiliser Java 17+ et que Maven a bien téléchargé les dépendances :
mvn clean install -USolution : Lancez la génération JAXB :
cd importdata
mvn generate-sources- SYSTEM_MODEL_DOCUMENTATION.md - Documentation technique du système de modèles
- CHANGELOG_UPDATE.md - Historique des mises à jour
- Neo4j Documentation - Documentation officielle Neo4j
Les contributions sont les bienvenues ! Pour contribuer :
- Forkez le projet
- Créez votre branche (
git checkout -b feature/AmazingFeature) - Committez vos changements (
git commit -m 'Add some AmazingFeature') - Poussez vers la branche (
git push origin feature/AmazingFeature) - Ouvrez une Pull Request
Ce projet est sous licence MIT - voir le fichier LICENSE pour plus de détails.
- TraXXX86 - Travail initial - TraXXX86
Pour toute question ou problème :
- Ouvrez une Issue
- Consultez la documentation