私は、ArangoDBをバックエンドに持つd3 force-directedグラフをベースにしたアプリケーションを構築しています.Arangoからノードとリンクのデータを動的にロードしたい可能な限り効率的にArangoDBを使ってArangoDBからd3のデータを取得する
私は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}
エンド出力は次のようになります。D3にほとんど直接読み取ることができ http://pastebin.com/raw.php?i=B7uzaWxs が...(私は少しだけを重複排除しなければなりません)。
グラフノードにはリンクが多いため、パフォーマンスは重要です(サーバーとクライアントの負荷、およびそれらの間の通信のファイルサイズの両方)。また、隣接ノードを単純に拡張する以外に、グラフとやりとりするためのさまざまなコマンドを作成する予定です。このAQLクエリをより構造化する方法(4つの別々のグラフクエリを避けるなど)や、arangojs関数やFOXXアプリケーションを使用してAQLを回避する方法がありますが、d3に必要な形式)?
これは非常に役に立ちます - ありがとう!最終的な頂点ドキュメントのプロパティが長さの配列に含まれていたので、 'vertexData:DOCUMENT(docId) 'を' vertexData:DOCUMENT(docId)[0] 'に変更しなければなりませんでした。頂点に直接取り付けられているのではなく1)。それ以外の場合は、魅力のように動作します。私はFOXXを学ぶのにもう少し時間があるときにFOXXコードに戻ってきますが、それは非常に役立ちます。 – ropeladder
歓迎です;) – mchacki