Я создаю приложение, основанное на d3-силовом графике с ArangoDB на бэкэнд, и я хочу иметь возможность загружать node и динамически связывать данные из Arango как можно эффективнее.
Я не эксперт в d3, но, как правило, силовой макет, похоже, хочет, чтобы его данные представляли собой массив узлов и массив ссылок, которые имеют фактические объекты node в качестве своих источников и целей, например
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 }
];
В настоящее время я использую следующий запрос AQL для получения соседних узлов, но это довольно громоздко. Часть трудности состоит в том, что я хочу включать информацию о краях для узлов, даже если эти ребра не пройдены (чтобы отобразить количество ссылок, которые < node имеет перед загрузкой этих ссылок из базы данных).
LET 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}
Конечный вывод выглядит следующим образом: http://pastebin.com/raw.php?i=B7uzaWxs ... который можно прочитать почти непосредственно в d3 (мне просто нужно немного дедуплицировать).
У моих узлов графа есть большое количество ссылок, поэтому производительность важна (как с точки зрения нагрузки на сервер и клиент, так и размер файла для связи между ними). Я также планирую создавать различные команды для взаимодействия с графиком, а не просто расширения соседних узлов. Есть ли способ лучше структурировать этот запрос AQL (например, избегая четырех отдельных запросов графа) или вообще избегать AQL с использованием функций arangojs или приложения FOXX, сохраняя при этом структурирование ответа в формате, который мне нужен для d3 (включая данные ссылок с каждым node)?