【发布时间】:2015-11-22 14:19:35
【问题描述】:
我正在构建一个基于 d3 力导向图的应用,后端使用 ArangoDB,我希望能够尽可能高效地从 Arango 动态加载节点和链接数据。
我不是 d3 方面的专家,但总的来说,力布局似乎希望其数据作为节点数组和链接数组,这些链接以实际节点对象作为源和目标,如下所示:
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 查询来获取相邻节点,但它非常繁琐。部分困难是我想包含节点的边信息,即使这些边没有被遍历(以便在从数据库加载这些链接之前显示节点具有的链接数)。
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 查询(例如,通过避免四个单独的图形查询)或使用 arangojs 函数或 FOXX 应用程序完全避免 AQL,同时仍然以我需要的 d3 格式构建响应(包括与每个节点的链接数据)?
【问题讨论】:
标签: javascript d3.js arangodb