Skip to content

Instantly share code, notes, and snippets.

@tylertreat
Created May 11, 2018 22:13
Show Gist options
  • Save tylertreat/c26e597a61d5bf5377d0c3b6b5b64fb1 to your computer and use it in GitHub Desktop.
Save tylertreat/c26e597a61d5bf5377d0c3b6b5b64fb1 to your computer and use it in GitHub Desktop.
Super janky script to convert graphson to DOT format
import json
import sys
def main():
graphson_file = sys.argv[1]
_to_dot_graph(graphson_file)
def _to_dot_graph(graphson_file):
vertices_by_id = {}
with open(graphson_file) as f:
for l in f:
vertex = json.loads(l)
vertices_by_id[vertex['id']] = vertex
graph = {}
for vid, vertex in vertices_by_id.items():
node = {'name': vertex['label'] + ':' + vertex.get('name', '') + str(vid), 'label': vertex['label']}
outE = vertex.get('outE')
if outE:
node_edges = {}
for label, edges in outE.items():
label_edges = []
for edge in edges:
ref = vertices_by_id[edge['inV']]
label_edges.append(ref)
node_edges[label] = label_edges
node['edges'] = node_edges
else:
node['edges'] = {}
graph[vid] = node
for vid, vertex in vertices_by_id.items():
inE = vertex.get('inE')
if not inE:
continue
for label, edges in inE.items():
for edge in edges:
outV = vertices_by_id[edge['outV']]
outNode = graph[outV['id']]
label_edges = outNode['edges'].get(label)
if not label_edges:
label_edges = []
outNode['edges'][label] = label_edges
label_edges.append(vertex)
dedupe = set()
for vid, node in graph.items():
if node['label'] == 'User' or node['label'] == 'RootFolder' or node['label'] == 'Account' or node['label'] == 'PostalAddress':
continue
outE = node.get('edges')
if not outE:
dedupe.add(node['name'])
continue
for label, edges in outE.items():
for edge in edges:
if edge['label'] == 'User':
continue
dedupe.add(node['name'] + ' -> ' + edge['label'] + ':' + str(edge['id']) + '[label="' + label + '"]')
with open(graphson_file + '.dot', 'w+') as out:
out.write('digraph {\n')
for line in dedupe:
out.write('\t' + line + ';\n')
out.write('}')
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment