Mi sono imbattuto in preoccupazioni simili qualche tempo fa. La soluzione con cui finalmente sono arrivato è una piccola libreria js che ha fatto perfettamente il trucco, ovvero Dracula.
Questo è il link alla libreria: https://github.com/strathausen/dracula
Considerando le vostre esigenze, tutto quello che dovrete fare è qualcosa di simile:
var g = new Graph();
g.addEdge('author', 'create');
g.addEdge('author', 'reader');
g.addEdge('author', 'admin');
// add here the other edges.
var layouter = new Graph.Layout.Spring();
layouter.layout();
var renderer = new Graph.Renderer.Raphael('#canvas', g, 400, 300);
renderer.draw();
Per maggiori informazioni, vi svelo lotta con la documentazione.
Spero che aiuti.
[ADDENDUM]
Vorrei aggiungere che, in generale, la questione di visualizzare i nodi e le frecce non è un grosso problema, usando svg rende vicino banale. Ma le cose si complicano quando si vuole organizzare la visualizzazione dei nodi con regole come "cercare di minimizzare il numero di fronti di attraversamento", "mostrare i bambini sotto il loro genitore", ecc. Che richiedono tutti una matematica complessa.
Non penso che Dracula consenta di personalizzare questo tipo di regole. Tuttavia, considerando il tuo commento, penso che ci possa essere un modo non troppo complicato per rendere il layout simile a un albero verticale, poiché è un grafo aciclico (almeno sembra essere). Ma poi dovrai passare attraverso la creazione della tua biblioteca per questo.
Puoi provare con il pacchetto di pere? –
Puoi usare anche http://sigmajs.org/ library –