mardi 14 février 2017

Chemin de Maven dependency tree à Neo4j

     Histoire de jouer un peu avec la techno, l'objet de ma recherche était de trouver le chemin le plus pour passer de l'output Maven dependency:tree à un joli graph Neo4j (en version 3.0.6).

     Premier constat pas de solution directe remontée par google sur des personnes ayant eu la même problématique. Du coup plusieurs approches possibles :

Je code

  • je recode vraiment tout, je récupère un output de mvn dependency tree (Plugin Maven dependency tree) et je parse le resultat (sorti console ou output spécifié au plugin) dans mon langage favori. Une fois que j'ai mon modèle objet je le parcours et l'insère dans Neo4j
  • Si Maven dependency peut me sortir un ascii art, c'est du code Java autant réutiliser son tree model
  • Je parcours le web et vois ce qui peut m'aider : Aether (https://wiki.eclipse.org/Aether/Transitive_Dependency_Resolution)

Ou maximum de reuse


     Par soucis d'efficacité pour un besoin plus de l'ordre du tooling je vois ce que je peux faire sans avoir à coder.

Export côté Maven

     Plutôt que réutilisé la sortie console j'utilise le plugin et spécifie on output. Tiens je peux produire du Graphml :
"mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml" (et si besoin j'utilise les -Dincludes et excludes qui vont bien)

     A partir de là j'ai mes dépendances dans un fichier Graphml.

Import côté Neo4j 


     Je lance ma console Neo4j (url disponible sous http://localhost:7474/)
  • Voir le résultat de mon import : MATCH (n) RETURN n;
  • Tout effacer pour recommencer : MATCH (n), ()-[r]-() DELETE n,r
  • Ou encore pour partir d'une base vide avant de lancer ma base effacer le contenu de \data\databases\

Import via neo4j-shell


     Je lance mon shell (sous bin) et tape la ligne de commande qui va bien :
neo4j-sh (?)$ import-graphml -i "file:///c:/My/LocalPath/toMyFile/dependency.graphml" -r DEPENDS_ON -t

     Je retourne dans ma console et visualise le graph. Problème malgré l'option -t je perd mes labels et propriétés .... après avoir creusé pas de pistes sérieuses, peut être problème de format du graphml.

Import via APOC


     Je tente ma chance, récupération d'APOC
  • download : https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/tag/3.0.4.2
  • je le place dans le répertoire plugin de mon Neo4j
  • je modifie ma configuration neo4j pour ajouter les 2 propriétées suivante
    • apoc.export.file.enabled=true
    • apoc.import.file.enabled=true
  • je démarre mon neo4j et teste : call apoc.help("apoc")
     Commande d'import (dans ma console) :
 CALL apoc.import.graphml("file:///c:/My/LocalPath/toMyFile/dependency.graphml", {batchSize: 10000, readLabels: true, storeNodeIds: true, defaultRelationshipType:"DEPENDSON"});

     Cela ne marche pas mieux ... Je tente un export de graph histoire de voir le format (call apoc.export.graphml.all("test",{}) me génère un fichier graphml a la racine de ma base neo4j)

On fait quoi ....

Je reste sur ma ligne on a dit sans code .... 


     Du coup 3e voie je passe par jEd (https://www.yworks.com/downloads#yEd) pour visualiser mon graph. A voir aussi Gephi (https://gephi.org/)

Quelques commandes de mise en forme :
  • Open Document -> dependency.graphml > OK.
  • Tools > Fit Note to Label … > OK
  • Layout > Hierarchical > Orientation > Left to Right > OK

Quand j'aurais le temps de coder


Je continu à explorer

Conclusion


    J'ai un résultat visualisation de mon graph mais pas dans l'outil souhaité. Ce n'est que partie remise et compte bien retourner sur Neo4j qui fait quand même des choses sympa (https://gist.github.com/jexp/90f590ad1d125284bc35223c86bebd33)



Aucun commentaire:

Enregistrer un commentaire