当前位置: 首页 > 知识库问答 >
问题:

从节点和边而不是子级绘制径向树

呼延弘方
2023-03-14

我能够从neo4j数据中用d3绘制一张图,但我在绘制一棵树时遇到了困难。我看到的示例使用了一个json文件,其中每个节点都包含一个自己的子节点数组。虽然这看起来很方便,但与neo4j接口并不容易-至少对我来说是这样。实际上,neo4j不会让一个从(n)-(m)图返回{nodes:collect(distinct{name:n.name,children:collate(distincent{name:m.name})})。然而,它将允许从路径返回节点和边的集合。

我的问题是,是否有可能在d3中从节点和边缘绘制一棵树,而无需为数据结构中的每个节点都设置子节点?

提前非常感谢皮埃尔

共有2个答案

颜文康
2023-03-14

对于返回管理器及其各自的子级的cypher查询,这样做怎么样?

match (manager)<-[:REPORTS_TO]-(direct_reports)
return id(manager), collect(id(direct_reports))
沈旻
2023-03-14

从neo4j中检索节点和关系的Cypher查询应该是:

MATCH p=() <-[:REPORTS8TO]- ()
UNWIND nodes(p) AS n UNWIND rels(p) AS r 
WITH n, r ORDER BY n.Name 
RETURN {nodes: COLLECT(DISTINCT n), links: COLLECT(DISTINCT {source: id(endNode(r)), target: id(startNode(r))})}

因此,javascript 和 d3 代码: - 从 json 中提取节点和关系

var obj = JSON.parse(xmlhttp.responseText);
var json = obj.data[0][0];

var nodeMap = {};
json.nodes.forEach(function(x) {
    nodeMap[x.id] = x;
    nodeMap[x.id].children = [];
});

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.select("#tree").select("svg").remove();

var width = 280, height = 870;

var margin = {
        top: 0,
        bottom: 0,
        left: 10,
        right: 120
    }

var tree = d3.layout.tree()
    .size([height - margin.top - margin.bottom, width - margin.left - margin.right]);

var diagonal = d3.svg.diagonal()
    .projection(function(d) { return [d.y, d.x]; });

var vis = d3.select("#tree").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom )
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

// Compute the new tree layout from root
var nodes = tree.nodes(root).reverse(), links = tree.links(nodes);

var link = vis.selectAll("path.link")
    .data(links)
    .enter().append("path")
    .attr("class", "link")
    .attr("d", diagonal);

var node = vis.selectAll("g.node")
    .data(nodes)
    .enter().append("g")
    .attr("class", "node")
    .attr("transform", function(d) { return "translate(" + d.y + ", " + d.x + ")"; })

node.append("rect")
    .attr("width", 9)
    .attr("height", 9)
    .attr("y", -4)
    .attr("class", function(d) { return "node "+d.type; } );

node.append("text")
    .attr("dx", function(d) { return d.children ? -14 : 14; })
    .attr("dy", 4)
    .attr("text-anchor", function(d) { return d.children ? "end" : "start"; })
    .attr("class", function(d) {return "node "+d.type+" text"; })
    .attr("style", "stroke-wdth: 0.5px; font: 10px sans-serif;")
    .text(function(d) { if (d.Name != "Panel") { return d.Name; }});
 类似资料:
  • 问题内容: 我想将图像列表读入Python / Matplotlib,然后在图形中绘制此图像而不是其他标记(如点)。我曾尝试使用imshow,但未成功,因为我无法将图像移到另一个位置并适当缩放。也许有人有一个好主意:) 问题答案: 有两种方法可以做到这一点。 根据希望的位置,使用带有kwarg集的图像进行绘制。 在里面使用。 第一种方法最容易理解,但是第二种方法具有很大的优势。k注解框方法将使图像

  • 我想从父节点复制到子节点。我真的不确定这是如何实现的。 我的源xml 我想得到输出为 我想要XSLT1.0中的解决方案。 我想将这些节点复制到子节点 谢谢。

  • 我正在研究一个依赖图,它由多个节点和图中从一个节点到另一个节点的多条有向边组成。 我试图通过添加n个节点作为圆和这些节点之间的边作为线来绘制图形的可视化。 我使用图形库的Java随着JGroup和Jframe。 这是我目前编写的代码: 我能画两个圆和一条线,但我遇到的问题是用一条边连接这两个圆。 我在画布上的随机位置绘制了每个节点,并想在这两个节点之间添加一条线。这条线有Point1(x1, y1

  • 我希望生成一个可视化xml文件结构的图形。 我创建了一个节点列表来表示xml文件 每个节点包含3个字符串:xml标记、属性和内容。 xml 文件如下所示: 我希望通过枚举节点列表,使用Plotly和igraph库生成一个树形图。 我在这里使用这个网站作为参考。 我的XML文件包含子元素数量可变的元素。然而,给出的例子只向我展示了如何开发一个具有固定数量的子节点的树(这个例子展示了每个节点2个子节点

  • 问题内容: 我可以配置为将日志写在文件上,而不是在控制台上打印吗? 问题答案: 2013年更新- 围绕Node v0.2和v0.4编写;现在,围绕日志记录有更好的工具。我强烈推荐温斯顿 2013年末更新- 我们仍然使用winston,但现在有了记录器库,用于围绕自定义对象的记录和格式来包装功能。这是我们logger.js的示例 https://gist.github.com/rtgibbons/7

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?