使用Neo4j和D3.js构建关系网络(neo4jd3.js)

Neo4j,作为一种基于图的数据库,可以通过网络关系来存储和查询数据,而D3.js则是目前使用最为广泛的可视化工具,一起能够构建出一个功能强大的关系网络图。

Neo4j有着许多节点和关系,它们会被赋予统一的数据结构,并且会同时也指定相互之间的关系和属性,这里使用Neo4j获取网络数据,它们可以准确的表达网络的关系,以及它们之间的强烈关系。

借助Neo4j,在数据可视化层面上来看,通过一些简单的代码:

`MATCH (x)(y)

RETURN z, x, y`

可以从所有购买顾客的关系中,查询所有的顾客、关系和关系类型,从而得到从顾客到订单的关系数据。

接下来就是可视化时D3.js的使用。这是一个JavaScript库,它通过简洁、独特的API构建出强大的交互式图表和关系网络图。

首先,得到节点和边数据:

`var nodes = dataMapping.nodes;

var edges = dataMapping.edges;`

然后初始化一个D3 canvas:

`var width = 1000;

var height = 1000;

var svg = d3.select(“#dag-container”)

.append(“svg”)

.attr(“width”, width)

.attr(“height”, height);`

初始化一个 D3.js的力场图

`var simulation = d3.forceSimulation()

.force(“link”, d3.forceLink().id(function (d) {return d.id;}))

.force(“charge”, d3.forceManyBody())

.force(“collide”, d3.forceCollide())

.force(“center”, d3.forceCenter(width / 2, height / 2));`

添加数据

`var link = svg.append(“g”)

.attr(“class”, “links”)

.selectAll(“line”)

.data(edges)

.enter()

.append(“line”)

.attr(“stroke-width”, 3);

var node = svg.append(“g”)

.attr(“class”, “nodes”)

.selectAll(“circle”)

.data(nodes)

.enter()

.append(“circle”)

.attr(“r”, 20)

.attr(“fill”, “#9ACD32”)

.call(d3

.drag()

.on(“start”, dragStart)

.on(“drag”, dragging)

.on(“end”, dragEnd));`

添加箭头

`svg.append(“defs”).selectAll(“marker”)

.data(edges)

.enter().append(“marker”)

.attr(“id”, function (d) { return d.id; })

.attr(“viewBox”, “0 -5 10 10”)

.attr(“refX”, 20)

.attr(“refY”, 0)

.attr(“markerWidth”, 10)

.attr(“markerHeight”, 10)

.attr(“orient”, “auto”)

.append(“path”)

.attr(“d”, “M0,-5L10,0L0,5”);`

最后,通过一些嵌套函数,来使节点在弹性拉力作用时“活”起来:

`simulation.nodes(nodes)

.on(‘tick’, tick);

simulation.force(“link”)

.links(edges);

function tick() {

link

.attr(“x1”, function (d) {

return d.source.x;

})

.attr(“y1”, function (d) {

return d.source.y;

})

.attr(“x2”, function (d) {

return d.target.x;

})

.attr(“y2”, function (d) {

return d.target.y;

});

node

.attr(“cx”, function (d) {

return d.x;

})

.attr(“cy”, function (d) {

return d.y;

});

}`

通过刚才的代码,就可以借助 Neo4j 和 D3.js 构建出一个关系网络图,在实战中有着诸多应用。


数据运维技术 » 使用Neo4j和D3.js构建关系网络(neo4jd3.js)