2014-12-21 8 views
2

извлечь узлы и отношения из базы данных Neo4j, используя следующий CYPHER запрос: совпадение р = (: Корень) < - [: linkedTo] - (+) Отмотать узлы (р) как н размотать RELS (р) при г return {nodes: collect (distinct n), links: collect (distinct {source: id (endNode (r)), target: id (startNode (r))}}}Как создать d3-лучевое дерево из списка узлов и ссылок?

Я конвертирую результат запроса в массивов узлов и ссылок следующим образом:

var obj = JSON.parse(xmlhttp.responseText); 
var json = obj.data[0][0]; 
// Extract node list from neo4j/json data 
var nodes = []; 
for (n in json.nodes) { 
    var nodeObj = json.nodes[n]; 
    var node = nodeObj.data; 
    node.id = nodeObj.metadata.id; 
    node.type = nodeObj.metadata.labels[0]; 
    nodes.push(node); 
} 
// Create a node map 
var nodeMap = {}; 
nodes.forEach(function(x) { nodeMap['_'+x.id] = x; nodeMap['_'+x.id].children = []; }); 

// Extract link list from neo4j/json data 
var links = json.links.map(function(x) { 
     nodeMap['_'+x.source].children.push(nodeMap['_'+x.target]); 
     return { source: nodeMap['_'+x.source], target: nodeMap['_'+x.target] }; 
    }); 

Как я должен генерировать дерево в d3 из узлов и ссылок? Console.log() показывает, что массивы узлов и линий имеют правильный формат, каждый узел также содержит список его дочерних элементов.

ответ

2

Как уже упоминалось выше, структура данных была правильной с узлами и дочерними элементами. Недостающей частью был корневой узел. Поэтому я изменил Cypher запрос для определения корневого узла, который присоединяет будет называться корень в моем графике, следующим образом:

match p=(:Panel) <-[:belongsTo]-(), (root:Panel {Name: "root"}) 
unwind nodes(p) as n unwind rels(p) as r 
return {root: id(root), nodes: collect(distinct n), links: collect(distinct {source: id(endNode(r)), target: id(startNode(r))})} 

Следовательно, дерево объявляется как предложено в http://bl.ocks.org/d3noob/8324872:

var tree = d3.layout.tree() 
    .size([360, radius - 120]); 

var diagonal = d3.svg.diagonal.radial() 
    .projection(function(d) { return [d.y, d.x/180 * Math.PI]; }); 

var vis = d3.select("#chart").append("svg") 
    .attr("width", radius * 2) 
    .attr("height", radius * 2 - 150) 
    .append("g") 
    .attr("transform", "translate(" + radius + "," + radius + ")"); 

// Compute the new tree layout starting with root 
var root = nodeMap['_'+json.root]; 
var nodes = tree.nodes(root).reverse(), links = tree.links(nodes); 
... 

Итак, фокус в том, чтобы сообщать о корне, узлах и ссылках из neo4j в формате JSON, а затем строить массив узлов, карту узлов и назначать дочерние узлы в карте узлов на основе ссылок.

Смежные вопросы