Too Busy to Create Your Own Visualizations? Just Leverage the Neo4J Console

In Vueling we have almost 700 applications using hundreds of databases, queues, FTP sites, web services, remote file shares etc. Understanding how everything fits together is a lost battle without visualizations and we model our entire infrastructure in Neo4J.

I first started modelling our architecture in Neo4J as a personal project for fun. But it soon became known wider in the development floor and people were coming to me to see it and ask how a particular component fitted into the system. I added more components including the assembly relationships of the 4000+ assemblies being supported plus all the Microsoft and open source stuff we were using.

At first I enjoyed getting all the requests for information. What applications use this version of this nuget package? Do any packages reference this file path? What are the subscribers to this service bus message? Which applications have write access to this database? The list goes on. My Cypher skills increased and I had a good idea of what other people wanted from the data. But I decided it was time that people became self sufficient, not relying on me so much.

I hosted it in an EC2 instance and gave out the link, credentials and links to Cypher tutorials. Did that help? No not at all! I had figured that most were developers with a few IT managers and project managers thrown in. Cypher in its most basic form is well, pretty basic, if they can learn an OO language then they can learn enough Cypher to get by. But I was wrong, no one had the time or the inclination to learn and they just kept coming back to me.

It stayed like this for about a year. I had planned on learning D3 and building my own visualization for our data model that would allow users to simply point and click and not write a single line of Cypher. But with my workload and twins at home I never had the time and usage of Neo4J stayed relatively low with the majority coming directly to me. The few that did have a go usually made mistakes with their Cypher and ended up coming to me anyway.

Finally a few months ago I decided to do something. I am no front-end expert, what with my visual problems but I thought I'd have a crack at it. D3 looks cool but I seriously don't have the time needed to do the job I'd like with that awesome library. My idea was just to build a Cypher query builder with auto-complete for resource names and users could copy and paste their queries into the Neo4J console. That way we get the awesome out of the box visualizations and users get introduced to Cypher through example.

I built a UI with Bootstrap consisting of a single html file, one CSS, two JavaScript files and bunch of images built with Inkscape. One JavaScript file had the UI manipulation logic and the other contained the JavaScript arrays with all the resource names. This last file gets auto-generated by the ETL process that reads the config files and loads that data into Neo4J.

I've named it GRASS and it has the Neo4J console embedded as an IFrame.

Click the Select a Query button and you get lots of options for generating the query you want.

When you type in the textbox you get auto-complete resource names. So you don't need to remember the exact names of the 700 applications, 300 databases etc.

Since I introduced this Neo4J wrapper I have not had a single request for data and both times I've turned it off for an upgrade to Neo4J people were messaging me telling me it was offline.

So I learned that even when your users are developers, don't assume that they have the time or inclination to learn the query language of your shiny new toy, even if it brings them value. But I also learned that you don't need a cool custom visualization to shield your users from Cypher. But you have to offer a separate throw-away version of the database for these users as anyone could easily delete stuff. This database gets replaced entirely when I update it. But you really can't beat the flexibility and power of raw Cypher with a query builder.

The code for generating the data is super specific to Vueling. We have a custom configuration system, custom build processes etc so there is nothing generic to share. But I have put the query builder front-end stuff on GitHub - https://github.com/Vanlightly/GRASS - but be warned! I am NOT a UI guy so my code probably smells pretty bad.

Thanks to Angel, my Bootstrap mentor, who helped this back-end guy to believe that he could build something pleasant to look at in a web browser. Thanks buddy!