I am using ArangoDB community edition, I can query on a created graph in AQL
and get results in JSON which is graphically visualized on ArangoDB web interface tool.
AQL
QueryFOR v,e,p IN 1..3 OUTBOUND 'germanCity/Hamburg' GRAPH 'routeplanner'
OPTIONS{bfs :true}
RETURN p
[
{
"edges": [
{
"_key": "6392826",
"_id": "germanHighway/6392826",
"_from": "germanCity/Hamburg",
"_to": "germanCity/Cologne",
"_rev": "_WmZ77pW--D",
"distance": 500
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": false,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Cologne",
"_id": "germanCity/Cologne",
"_rev": "_WmZ77Y6--B",
"population": 1000000,
"isCapital": false,
"loc": [
50.9364,
6.9528
]
}
]
},
{
"edges": [
{
"_key": "6392840",
"_id": "internationalHighway/6392840",
"_from": "germanCity/Hamburg",
"_to": "frenchCity/Paris",
"_rev": "_WmZ77pa--_",
"distance": 900
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": false,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Paris",
"_id": "frenchCity/Paris",
"_rev": "_WmZ77Z---D",
"population": 4000000,
"isCapital": true,
"loc": [
48.8567,
2.3508
]
}
]
},
{
"edges": [
{
"_key": "6392843",
"_id": "internationalHighway/6392843",
"_from": "germanCity/Hamburg",
"_to": "frenchCity/Lyon",
"_rev": "_WmZ77pa--B",
"distance": 1300
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": false,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Lyon",
"_id": "frenchCity/Lyon",
"_rev": "_WmZ77Z---B",
"population": 80000,
"isCapital": false,
"loc": [
45.76,
4.84
]
}
]
}
]
As we can get visualized graph output in web interface I would like to display the same in Language<->ArangoDB. Language here can be driver language supported : Python, Java , C# etc.
I am using pyArango
for interfacing with ArangoDB
I couldnt find an ArangoDB API for getting this graph visualization in JPG or matlibplot.
Is there any other way apart from using below two options?
networkx.draw(networkx.graph)
matplotlib.pyplot
If you need graph visualization then Graphviz library is for you. And if Python is OK then you only need a Python binding-library graphviz (that utilizes DOT language representation internally.)
It is super easy to feed your graph JSON from Arango DB to graphviz for rendering.
You can customize it to your style, add labels, colors, reshape nodes and more.
Here is a simple example of your sample JSON:
from graphviz import Digraph
arango_graph = [
{
"edges": [
{
"_key": "6392826",
"_id": "germanHighway/6392826",
"_from": "germanCity/Hamburg",
"_to": "germanCity/Cologne",
"_rev": "_WmZ77pW--D",
"distance": 500
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": False,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Cologne",
"_id": "germanCity/Cologne",
"_rev": "_WmZ77Y6--B",
"population": 1000000,
"isCapital": False,
"loc": [
50.9364,
6.9528
]
}
]
},
{
"edges": [
{
"_key": "6392840",
"_id": "internationalHighway/6392840",
"_from": "germanCity/Hamburg",
"_to": "frenchCity/Paris",
"_rev": "_WmZ77pa--_",
"distance": 900
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": False,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Paris",
"_id": "frenchCity/Paris",
"_rev": "_WmZ77Z---D",
"population": 4000000,
"isCapital": True,
"loc": [
48.8567,
2.3508
]
}
]
},
{
"edges": [
{
"_key": "6392843",
"_id": "internationalHighway/6392843",
"_from": "germanCity/Hamburg",
"_to": "frenchCity/Lyon",
"_rev": "_WmZ77pa--B",
"distance": 1300
}
],
"vertices": [
{
"_key": "Hamburg",
"_id": "germanCity/Hamburg",
"_rev": "_WmZ77Z---_",
"population": 1000000,
"isCapital": False,
"loc": [
53.5653,
10.0014
]
},
{
"_key": "Lyon",
"_id": "frenchCity/Lyon",
"_rev": "_WmZ77Z---B",
"population": 80000,
"isCapital": False,
"loc": [
45.76,
4.84
]
}
]
}
]
graph_name = 'amazing'
g = Digraph(graph_name, filename=graph_name, format='jpeg', engine='neato')
g.attr(scale='2', label='Look at my graph my graph is amazing!', fontsize='18')
g.attr('node', shape='circle', fixedsize='true', width='1')
for item in arango_graph:
for vertex in item['vertices']:
g.node(vertex['_id'], label=vertex['_key'])
for edge in item['edges']:
g.edge(edge['_from'], edge['_to'], label=str(edge['distance']))
# Render to file into some directory
g.render(directory='/tmp/', filename=graph_name)
# Or just show rendered file using system default program
g.view()
Just 3 code lines for customization and 5 more to feed the graph visualization renderer. And please note that Arango Web UI does not render all of the edges between the same pair of nodes while graphviz does and you can style each differently.
You will need to install graphviz
library and Python bindings
Step #1: Install library
Assuming your machine is Ubuntu:
sudo apt install graphviz
Step #2: Get Python bindings
pipenv install graphviz
If you not yet using Pipenv you can install with good old Pip:
pip install graphviz
Step #3: Run sample and enjoy