仿Neo4j里的知识图谱,利用d3+vue开发的一个网络拓扑图
项目需要画一个类似知识图谱的节点关系图。
一开始用的是echart画的。
根据https://gallery.echartsjs.com/editor.html?c=xH1Rkt3hkb,成功画出简单的节点关系。
如图:

总结——
【优点】:关系一目了然,可以鼠标悬浮查看相邻节点,其他节点淡化。
【缺点】:拖动结果不理想,尤其是数据过多时,一旦拖动一个,整个页面所有的节点都在动,很久都无法停止(可能是我配置方法不对,但是后续没找到解决方法)
于是转而使用d3力导图。


除了基本的节点展示和拖动之外,还可以双击新增节点,以及右击展示节点详情。
核心操作有以下:
1、绘制graph力
var simulation = d3
.forceSimulation(nodes)
.force(
'collide',
d3
.forceCollide()
.radius(() => 30)
.iterations(2)
)
.force(
'charge',
d3
.forceManyBody()
// .distanceMax(300)
.strength(-400)
)
.force(
'link',
d3
.forceLink(links)
.id(d => d.id)
.distance(100)
)
.force('center', d3.forceCenter(this.width / 2, this.height / 2))
// .force('x', d3.forceX(this.width / 2))
// .force('y', d3.forceY(this.height / 2))
2、绘制存放节点和关系的svg
var svgArea = d3
.select('.containers')
.append('svg')
.attr('viewBox', [0, 0, this.width, this.height])
.attr('class', 'd3Test')
.call(
d3.zoom().on('zoom', function() {
g.attr('transform', d3.event.transform)
})
)
.on('dblclick.zoom', () => {}) // 禁止双击放大
3、绘制节点关系
var links = g
.append('g')
.attr('class', 'links')
.selectAll('path')
.data(links, function(d) {
if (typeof d.source === 'object') {
return d.source.name + '_' + d.relationship + '_' + d.target.name
} else {
return d.source + '_' + d.relationship + '_' + d.target
}
})
.join('path')
.attr('stroke-width', d => Math.sqrt(d.value))
.attr('class', 'link')
.attr('id', function(d) {
if (typeof d.source === 'object') {
return d.source.name + '_' + d.relationship + '_' + d.target.name
} else {
return d.source + '_' + d.relationship + '_' + d.target
}
})
4、绘制节点
var nodes = g
.append('g')
.attr('class', 'nodes')
.selectAll('circle')
.data(nodes, d => d.name)
.join('circle')
.attr('r', d => (d.number ? d.number : 20))
.attr('class', 'node')
.attr('stroke', '#fff')
.attr('stroke-width', 1.5)
.attr('fill', this.color)
.on('dblclick', this.dbclickNode)//双击节点事件
.on('click', this.clickNode)//单击节点触发事件
// .on('mouseover', this.mouseoverNode)
// .on('mouseout', this.mouseoutNode)
.call(this.drag(this.simulation))
5、然后还有个让节点缓慢停止下来的tick
 this.simulation.on('tick', () => {
        this.links.attr('d', function(d) {
          if (d.source.x < d.target.x) {
            return (
              'M ' +
                            d.source.x +
                            ' ' +
                            d.source.y +
                            ' L ' +
                            d.target.x +
                            ' ' +
                            d.target.y
            )
          } else {
            return (
              'M ' +
                            d.target.x +
                            ' ' +
                            d.target.y +
                            ' L ' +
                            d.source.x +
                            ' ' +
                            d.source.y
            )
          }
        })
        this.nodes
          .attr('cx', function(d) {
            if (d.fixed) {
              d.fx = nodes[d.index].x
            }
            return d.x
          })
          .attr('cy', function(d) {
            if (d.fixed) {
              d.fy = nodes[d.index].y
            }
            return d.y
          })
        this.nodesName.attr('x', d => d.x).attr('y', d => d.y)
      })
附上官网案例:https://observablehq.com/@d3/force-directed-graph
这个案例的版本好像比较老,个人建议用新版,不过新版的API有改动。
参考案例:https://eisman.github.io/neo4jd3/
仿Neo4j里的知识图谱,利用d3+vue开发的一个网络拓扑图的更多相关文章
- [知识图谱]利用py2neo从Neo4j数据库获取数据
		# -*- coding: utf-8 -*- from py2neo import Graph import json import re class Neo4jToJson(object): &q ... 
- 知识图谱-生物信息学-医学顶刊论文(Briefings in Bioinformatics-2021):生物信息学中的图表示学习:趋势、方法和应用
		4.(2021.6.24)Briefings-生物信息学中的图表示学习:趋势.方法和应用 论文标题: Graph representation learning in bioinformatics: ... 
- 如何系统学习知识图谱-15年+IT老兵的经验分享
		一.前言 就IT而言,胖子哥算是老兵,可以去猝死的年纪,按照IT江湖猿龄的规矩,也算是到了耳顺之年:而就人工智能而言,胖子哥还是新人,很老的新人,深度学习.语音识别.人脸识别,知识图谱,逐个的学习了一 ... 
- 利用d3.js绘制雷达图
		利用d3,js将数据可视化,能够做到数据与代码的分离.方便以后改动数据. 这次利用d3.js绘制了一个五维的雷达图.即将多个对象的五种属性在一张图上对照. 数据写入data.csv.数据类型写入typ ... 
- 知识图谱与机器学习|KG入门 -- Part2 建立知识图谱
		介绍 在本系列前面两篇文章中我一直在讨论Data Fabric,并给出了一些关于Data Fabric中的机器学习和深度学习的概念.并给出了我对Data Fabric的定义: Data Fabric是 ... 
- springboot2.0+Neo4j+d3.js构建知识图谱
		Welcome to the Neo4j wiki! 初衷这是一个知识图谱构建工具,最开始是对产品和领导为了做ppt临时要求配合做图谱展示的不厌其烦,做着做着就抽出一个目前看着还算通用的小工具 技术栈 ... 
- 知识图谱里的知识存储:neo4j的介绍和使用
		一般情况下,我们使用数据库查找事物间的联系的时候,只需要短程关系的查询(两层以内的关联).当需要进行更长程的,更广范围的关系查询时,就需要图数据库的功能. 而随着社交.电商.金融.零售.物联网等行 ... 
- 知识图谱实战开发案例剖析-番外篇(1)- Neo4j是否支持按照边权重加粗和大数量展示
		一.前言 本文是<知识图谱实战开发案例完全剖析>系列文章和网易云视频课程的番外篇,主要记录学员在知识图谱等相关内容的学习 过程中,提出的共性问题进行展开讨论.该部分内容原始内容记录在网易云 ... 
- [知识图谱]Neo4j知识图谱构建(neo4j-python-pandas-py2neo-v3)
		neo4j-python-pandas-py2neo-v3 利用pandas将excel中数据抽取,以三元组形式加载到neo4j数据库中构建相关知识图谱 Neo4j知识图谱构建 1.运行环境: pyt ... 
随机推荐
- 做一个有价值的seoer
			什么是SEO就不用在解释了吧,一般来看这篇文章的都是老鸟了,基础的术语解释也啥意义. 从早期的cms建站,到现在的批量镜像站群等操作,似乎搜索引擎现在都下了重手,前几年还好用的方式现在已经不再是那么理 ... 
- 20184302 2019-2020-2 《Python程序设计》实验四报告
			20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ... 
- 详解CurrentHashMap之预习篇
			CurrentHashMap的出现时为了解决HashMap的高并发导致OOM的缺陷,并且能够保证高性能读取.那么解读CurrentHashMap需要具备哪些知识的呢? HashMap 解读 Java ... 
- Java 切割字符串的几种方式
			按效率排: 1.StringTokenizer切割 是java.util中的一个类,包含的api有: StringTokenizer的方法请参考上一篇. 其中,countTokens为length:n ... 
- HBase 中加盐(Salting)之后的表如何读取:Spark 篇
			我们知道,HBase 为我们提供了 hbase-mapreduce 工程包含了读取 HBase 表的 InputFormat.OutputFormat 等类.这个工程的描述如下:This module ... 
- os模块查看系统数据
			>>> import os >>> os.name # 操作系统类型 'posix' 如果是posix,说明系统是Linux.Unix或Mac OS X,如果是nt ... 
- 文本溢出后,隐藏显示"..."和margin边距重叠
			一.隐藏加省略 单行文本: overflow: hidden; white-space: nowrap; text-overflow: ellipsis; 多行文本: overflow: hidden ... 
- 基于Web的监控系统的开发进行分布式和现代生产(外文翻译)
			摘要 近年来,Web技术发展迅速.尤其是网络浏览器增强了其功能因为JavaScript,CSS3和HTML5的改进.因此,功能越来越丰富的基于Web的软件解决方案功能范围可用.通过使用响应式网页设计( ... 
- arduino连接1602LCD方法
			arduino连接1602LCD方法 参考代码: 
- SpringBoot 缓存工作原理
			1. 自动配置类:CacheAutoConfiguration 2. 缓存的配置类: org.springframework.boot.autoconfigure.cache.GenericCache ... 
