Sto costruendo un'app basata su un grafico d3 force-directed con ArangoDB sul backend, e voglio essere in grado di caricare i dati di nodo e collegamento dinamicamente da Arango nel modo più efficiente possibile.Ottenere dati per d3 da ArangoDB usando AQL (o arangojs)
Non sono un esperto in d3, ma in generale il layout della forza sembra voler i suoi dati come una serie di nodi e una serie di collegamenti che hanno gli oggetti nodo reali come sorgenti e destinazioni, in questo modo:
var nodes = [
{id: 0, reflexive: false},
{id: 1, reflexive: true },
{id: 2, reflexive: false}
],
links = [
{source: nodes[0], target: nodes[1], left: false, right: true },
{source: nodes[1], target: nodes[2], left: false, right: true }
];
Attualmente sto usando la seguente query AQL per ottenere nodi vicini, ma è abbastanza ingombrante. Parte della difficoltà è che voglio includere informazioni sui bordi per i nodi anche quando questi bordi non sono attraversati (per visualizzare il numero di collegamenti che un nodo ha prima di caricare quei collegamenti dal database).
uscitaLET docId = "ExampleDocClass/1234567"
// get data for all the edges
LET es = GRAPH_EDGES('EdgeClass',docId,{direction:'any',maxDepth:1,includeData:true})
// create an array of all the neighbor nodes
LET vArray = (
FOR v IN GRAPH_TRAVERSAL('EdgeClass',docId[0],'any',{ maxDepth:1})
FOR v1 IN v RETURN v1.vertex
)
// using node array, return inbound and outbound for each node
LET vs = (
FOR v IN vArray
// inbound and outbound are separate queries because I couldn't figure out
// how to get Arango to differentiate inbout and outbound in the query results
LET oe = (FOR oe1 IN GRAPH_EDGES('EdgeClass',v,{direction:'outbound',maxDepth:1,includeData:true}) RETURN oe1._to)
LET ie = (FOR ie1 IN GRAPH_EDGES('EdgeClass',v,{direction:'inbound',maxDepth:1,includeData:true}) RETURN ie1._from)
RETURN {'vertexData': v, 'outEdges': oe, 'inEdges': ie}
)
RETURN {'edges':es,'vertices':vs}
La fine assomiglia a questo: http://pastebin.com/raw.php?i=B7uzaWxs ... che può essere letto quasi direttamente in d3 (non mi resta che deduplicare un po ').
I miei nodi grafici hanno una grande quantità di collegamenti, quindi le prestazioni sono importanti (sia in termini di carico sul server e client, sia di dimensioni del file per la comunicazione tra i due). Sto anche progettando di creare una varietà di comandi per interagire con il grafico oltre a espandere semplicemente i nodi vicini. C'è un modo per strutturare meglio questa query AQL (ad esempio evitando quattro query di grafici separati) o evitare completamente AQL utilizzando le funzioni arangojs o un'app FOXX, mentre ancora strutturando la risposta nel formato che mi serve per d3 (inclusi i dati di collegamento con ciascun nodo)?
Questo è incredibilmente utile - grazie! Ho dovuto cambiare 'vertexData: DOCUMENT (docId),' a 'vertexData: DOCUMENT (docId) [0]', per farlo funzionare con i miei dati in d3 (poiché altrimenti le proprietà del documento del vertice finale erano contenute in una matrice di lunghezza 1 invece di semplicemente attaccato direttamente al vertice). Altrimenti funziona come un fascino. Tornerò al codice FOXX quando avrò un po 'più di tempo per imparare FOXX, ma sembra molto utile. – ropeladder
siete i benvenuti;) – mchacki