echarts实现知识图谱,生产项目

news2025/5/10 15:31:06

echarts实现知识图谱,生产项目

  • 内容简介
    • 效果演示
    • 代码逻辑
    • 结束语

内容简介

在实际生产项目中,需要对后端知识数据进行展示。需求如下:

  • 点击节点可以展示与此节点相关的节点信息
  • 右键点击节点可以对节点的信息进行修改
  • 悬浮在节点上可以查看节点的详细信息

效果演示

  • 点击节点可以展示与此节点相关的节点信息
    在这里插入图片描述

点击之后展示与其相关的节点信息:
在这里插入图片描述

  • 右键点击节点可以对节点的信息进行修改
    在这里插入图片描述
  • 悬浮在节点上可以查看节点的详细信息
    在这里插入图片描述

代码逻辑

  1. 知识图谱展示
    知识图谱展示使用的时echarts中的关系图实现,具体代码如下:
function draw(zstpDatas, zstpLinks, zstpCategories) {
      var chartDom = document.getElementById("zstpContent");
      var myChart = echarts.init(chartDom);
      var option;


      option = {
        // color: ['#dbac00', '#db6e00', '#cf0000','#339a94',"#70c1b3", "#ff9f41", "#ffa54d"],
        color: ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc'],
        title: {
          text: "知识图谱展示",
          textStyle: {
            // color: 'white',
          },
          left: "30px",
          top: "20px",
        },
        tooltip: {
          show: true,
          trigger: 'item',
          formatter: function (params) {
            console.log(params)
            var relVal = params.name
            if (params.data.category === "设备") {
              return relVal += '<br/>' + "设备名称:" + params.data.value.eqName +
                '<br/>' + "父类:" + params.data.value.eqFather +
                '<br/>' + "手册编号:" + params.data.value.eqNum
            } else if (params.data.category === "部件") {
              return relVal += '<br/>' + "部件名称:" + params.data.value.partName
            } else if (params.data.category === "表象") {
              return relVal += '<br/>' + "表象名称:" + params.data.value.reName +
                '<br/>' + "类型:" + params.data.value.reType +
                '<br/>' + "危险等级:" + params.data.value.reDegree
            } else if (params.data.category === "缺陷") {
              return relVal += '<br/>' + "编号:" + params.data.value.insNum +
                '<br/>' + "电压等级:" + params.data.value.insKvLevel +
                '<br/>' + "站点:" + params.data.value.insLocation +
                '<br/>' + "设备名称:" + params.data.value.insEq +
                '<br/>' + "消缺班组:" + params.data.value.insGroup +
                '<br/>' + "缺陷描述:" + params.data.value.insDefectDes +
                '<br/>' + "措施描述:" + params.data.value.insMeasureDes +
                '<br/>' + "生产厂家:" + params.data.value.insEqMaker +
                '<br/>' + "出厂日期:" + params.data.value.insReleaseDate +
                '<br/>' + "设备型号:" + params.data.value.insEqType +
                '<br/>' + "投运日期:" + params.data.value.insRunData +
                '<br/>' + "原因:" + params.data.value.insReason +
                '<br/>' + "措施:" + params.data.value.insMeasure
            } else {
              return "该类型还未格式化内容"
            }

          }
        },
        legend: {
          show: true,
        },
        xAxis: {
          show: false,
        },
        yAxis: {
          show: false,
        },
        grid: {
          top: "80px",
        },
        series: [
          {
            type: "graph",
            // 是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
            roam: true,
            // 是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。[ default: false ]
            focusNodeAdjacency: true,
            // 力引导布局相关的配置项,力引导布局是模拟弹簧电荷模型在每两个节点之间添加一个斥力,每条边的两个节点之间添加一个引力,每次迭代节点会在各个斥力和引力的作用下移动位置,多次迭代后节点会静止在一个受力平衡的位置,达到整个模型的能量最小化。
            force: {
              // 力引导布局的结果有良好的对称性和局部聚合性,也比较美观。
              // [ default: 50 ]节点之间的斥力因子(关系对象之间的距离)。支持设置成数组表达斥力的范围,此时不同大小的值会线性映射到不同的斥力。值越大则斥力越大
              repulsion: 200,
              // [ default: 30 ]边的两个节点之间的距离(关系对象连接线两端对象的距离,会根据关系对象值得大小来判断距离的大小),
              edgeLength: [120, 100],
              // 这个距离也会受 repulsion。支持设置成数组表达边长的范围,此时不同大小的值会线性映射到不同的长度。值越小则长度越长。如下示例:
              // 值最大的边长度会趋向于 10,值最小的边长度会趋向于 50      edgeLength: [10, 50]
            },
            // 图的布局。[ default: 'none' ]
            layout: "force",
            // 'none' 不采用任何布局,使用节点中提供的 x, y 作为节点的位置。
            // 'circular' 采用环形布局;'force' 采用力引导布局.
            // 标记的图形
            symbol: "circle",
            edgeSymbol: ["arrow"],
            edgeSymbolSize: [10, 10],
            // 关系边的公用线条样式。其中 lineStyle.color 支持设置为'source'或者'target'特殊值,此时边会自动取源节点或目标节点的颜色作为自己的颜色。
            normal: {
              lineStyle: {
                // 线的颜色[ default: '#aaa' ]
                // color: '#fff',
                // 线宽[ default: 1 ]
                width: 1,
                // 线的类型[ default: solid实线 ]   'dashed'虚线    'dotted'
                type: "solid",
                // 图形透明度。支持从 0 到 1 的数字,为 0 时不绘制该图形。[ default: 0.5 ]
                opacity: 0.5,
                // 边的曲度,支持从 0 到 1 的值,值越大曲度越大。[ default: 0 ]
                curveness: Math.random() / 3,
              },
            },
            // 关系对象上的标签
            label: {
              normal: {
                // 是否显示标签
                show: true,
                // 标签位置:'top''left''right''bottom''inside''insideLeft''insideRight''insideTop''insideBottom''insideTopLeft''insideBottomLeft''insideTopRight''insideBottomRight'
                position: "inside",
                // 文本样式
                textStyle: {
                  fontSize: 16,
                  // color: 'white'
                },
              },
            },
            // 连接两个关系对象的线上的标签
            edgeLabel: {
              normal: {
                show: true,
                textStyle: {
                  // fontSize: 14
                },
                // 标签内容
                formatter: function (param) {
                  return param.data.category;
                },
              },
            },
            data: zstpDatas,
            // 节点分类的类目,可选。如果节点有分类的话可以通过 data[i].category 指定每个节点的类目,类目的样式会被应用到节点样式上。图例也可以基于categories名字展现和筛选。
            categories: zstpCategories,
            // 节点间的关系数据
            links: zstpLinks,
          },
        ],
      };

      myChart.on('contextmenu', function (params) {
        console.log("右键事件",params)
        $("#eqName").val(params.data.value.eqName)
        $("#eqFather").val(params.data.value.eqFather)
        $("#eqNum").val(params.data.value.eqNum)
        $('#ModalId').modal('show');
      }) // 右键事件


      // echarts图表的点击事件,可通过param参数确认点击的对象
      // 如果点击了节点2,显示节点2相关的数据
      myChart.on("click", function (param) {
        if (param.dataType == "node") {
          // Node2的 param.dataIndex 值为1
          if (param.data.category === "设备") {
            console.log("添加数据")
            for (let i = 0; i < 5; i++) {
              tmp_id = Math.ceil(Math.random() * 10);
              zstpDatas.push({
                id: tmp_id + param.data.id + i,
                name: param.data.name + i,
                draggable: true,
                symbolSize: [50, 50],
                itemStyle: {
                  // color: '#00ff00'
                },
                category: "设备",
                value: {
                  "eqName": param.data.name + i,
                  "eqFather": param.data.name,
                  "eqNum": i,
                }
              });
              zstpLinks.push(
                {
                  id: Math.random(),
                  target: tmp_id + param.data.id + i,
                  source: param.data.id,
                  // 关系对象连接线上的标签内容
                  category: "设备" + i,
                  lineStyle: {
                    width: 2,
                    curveness: Math.random() / 3
                  }
                },
              )
            }

            draw(zstpDatas, zstpLinks, zstpCategories)
          } else if (param.data.category === "缺陷") {
            console.log("添加数据")
            for (let i = 0; i < 5; i++) {
              tmp_id = Math.ceil(Math.random() * 100);
              zstpDatas.push({
                id: tmp_id + param.data.id + i,
                name: "总缺陷",
                draggable: true,
                symbolSize: [50, 50],
                itemStyle: {
                  // color: '#ff0000'
                },
                category: "缺陷",
                value: {
                  "insNum": "0001",
                  "insKvLevel": "电压等级",                  
                  "insEqMaker": "生产厂家",
                  "insReleaseDate": "出厂日期",
                  "insEqType": "设备型号",
                  "insRunData": "投运日期",
                  "insReason": "原因",
                  "insMeasure": "措施"
                }
              });
              zstpLinks.push(
                {
                  // id: Math.random(),
                  target: tmp_id + param.data.id + i,
                  source: param.data.id,
                  // 关系对象连接线上的标签内容
                  category: "缺陷" + i,
                  lineStyle: {
                    width: 2,
                    curveness: Math.random() / 3
                  }
                },
              )
            }

            draw(zstpDatas, zstpLinks, zstpCategories)
          } {
            // console.log("清除数据")
            // zstpDatas.pop();
            // zstpLinks.pop();
            // zstpCategories.pop();
            // draw(zstpDatas, zstpLinks, zstpCategories)
            // flag = false;
          }
        } else {
          console.log("点击了边")
        }
      });


      myChart.setOption(option);

    }

  1. 悬浮展示提示信息
    悬浮展示提示信息,原理就是对提示信息进行格式化。对应的配置项为:tooltip
        tooltip: {
          show: true,
          trigger: 'item',
          formatter: function (params) {
            console.log(params)
            var relVal = params.name
            if (params.data.category === "设备") {
              return relVal += '<br/>' + "设备名称:" + params.data.value.eqName +
                '<br/>' + "父类:" + params.data.value.eqFather +
                '<br/>' + "手册编号:" + params.data.value.eqNum
            } else if (params.data.category === "部件") {
              return relVal += '<br/>' + "部件名称:" + params.data.value.partName
            } else if (params.data.category === "表象") {
              return relVal += '<br/>' + "表象名称:" + params.data.value.reName +
                '<br/>' + "类型:" + params.data.value.reType +
                '<br/>' + "危险等级:" + params.data.value.reDegree
            } else if (params.data.category === "缺陷") {
              return relVal += '<br/>' + "编号:" + params.data.value.insNum +                
                '<br/>' + "缺陷描述:" + params.data.value.insDefectDes +
                '<br/>' + "措施描述:" + params.data.value.insMeasureDes +
                '<br/>' + "生产厂家:" + params.data.value.insEqMaker +
                '<br/>' + "出厂日期:" + params.data.value.insReleaseDate +
                '<br/>' + "设备型号:" + params.data.value.insEqType +
                '<br/>' + "投运日期:" + params.data.value.insRunData +
                '<br/>' + "原因:" + params.data.value.insReason +
                '<br/>' + "措施:" + params.data.value.insMeasure
            } else {
              return "该类型还未格式化内容"
            }
          }
        },
  1. 节点点击事件
    监听click事件。
      myChart.on("click", function (param) {
        if (param.dataType == "node") {
          // Node2的 param.dataIndex 值为1
          if (param.data.category === "设备") {
            console.log("添加数据")
            for (let i = 0; i < 5; i++) {
              tmp_id = Math.ceil(Math.random() * 10);
              zstpDatas.push({
                id: tmp_id + param.data.id + i,
                name: param.data.name + i,
                draggable: true,
                symbolSize: [50, 50],
                itemStyle: {
                  // color: '#00ff00'
                },
                category: "设备",
                value: {
                  "eqName": param.data.name + i,
                  "eqFather": param.data.name,
                  "eqNum": i,
                }
              });
              zstpLinks.push(
                {
                  id: Math.random(),
                  target: tmp_id + param.data.id + i,
                  source: param.data.id,
                  // 关系对象连接线上的标签内容
                  category: "设备" + i,
                  lineStyle: {
                    width: 2,
                    curveness: Math.random() / 3
                  }
                },
              )
            }

            draw(zstpDatas, zstpLinks, zstpCategories)
          } else if (param.data.category === "缺陷") {
            console.log("添加数据")
            for (let i = 0; i < 5; i++) {
              tmp_id = Math.ceil(Math.random() * 100);
              zstpDatas.push({
                id: tmp_id + param.data.id + i,
                name: "总缺陷",
                draggable: true,
                symbolSize: [50, 50],
                itemStyle: {
                  // color: '#ff0000'
                },
                category: "缺陷",
                value: {
                  "insNum": "0001",                
                  "insEqMaker": "生产厂家",
                  "insReleaseDate": "出厂日期",
                  "insEqType": "设备型号",
                  "insRunData": "投运日期",
                  "insReason": "原因",
                  "insMeasure": "措施"
                }
              });
              zstpLinks.push(
                {
                  // id: Math.random(),
                  target: tmp_id + param.data.id + i,
                  source: param.data.id,
                  // 关系对象连接线上的标签内容
                  category: "缺陷" + i,
                  lineStyle: {
                    width: 2,
                    curveness: Math.random() / 3
                  }
                },
              )
            }

            draw(zstpDatas, zstpLinks, zstpCategories)
          } {
            // console.log("清除数据")
            // zstpDatas.pop();
            // zstpLinks.pop();
            // zstpCategories.pop();
            // draw(zstpDatas, zstpLinks, zstpCategories)
            // flag = false;
          }
        } else {
          console.log("点击了边")
        }
      });


      myChart.setOption(option);

    }
  1. 右键点击事件
      myChart.on('contextmenu', function (params) {
        console.log("右键事件",params)
        $("#eqName").val(params.data.value.eqName)
        $("#eqFather").val(params.data.value.eqFather)
        $("#eqNum").val(params.data.value.eqNum)
        $('#ModalId').modal('show');
      }) // 右键事件
  1. 右键编辑
    右键编辑的逻辑:先准备好修改的form表单格式,通过外部$('#ModalId').modal('show');触发调用展示。
      myChart.on('contextmenu', function (params) {
        console.log("右键事件",params)
        $("#eqName").val(params.data.value.eqName)
        $("#eqFather").val(params.data.value.eqFather)
        $("#eqNum").val(params.data.value.eqNum)
        $('#ModalId').modal('show');
      }) // 右键事件

结束语

目前代码已经本地代码搭建完成,并进行组内演示。

逻辑以及业务需要继续完善,先记录一下思路和实现方式。如果也有同样需求的小伙伴可以交流讨论。

如果需要源代码的话,可以关注并私聊我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通用人工智能(AGI):人工智能的下一个阶段

除了人工智能(AI)的改进和新应用之外&#xff0c;大多数人都认为&#xff0c;当通用人工智能(AGI)出现时&#xff0c;人工智能的下一次飞跃将发生。我们将AGI宽泛地定义为机器或计算机程序理解或学习人类可以完成的任何智力任务的假设能力。然而&#xff0c;对于何时以及如何实…

系统性能测试指标

性能测试的目的 1.评估系统的能力&#xff0c;测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力&#xff0c;并帮助作出决策。 2.识别体系中的弱点&#xff1a;受控的负荷可以被增加到一个极端的水平&#xff0c;并突破它&#xff0c;从而修复体系的瓶颈或薄…

leetcode: Swapping Nodes in a Linked List

leetcode: Swapping Nodes in a Linked List1. 题目描述2. 题目解答3. 总结1. 题目描述 You are given the head of a linked list, and an integer k.Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node f…

ECMAScript 详解

ECMAScript 历史我们首先来看 ECMA 是什么。ECMA&#xff0c;是欧洲计算机制造商协会&#xff08;European Computer Manufacturers Association&#xff09;的简称&#xff0c;是一家国际性会员制度的信息和电信标准组织。1994 年之后&#xff0c;由于组织的标准牵涉到很多其他…

【Leetcode 剑指Offer】第 6 天 搜索与回溯算法(简单)

搜索与回溯剑指 Offer 32 - I. 从上到下打印二叉树层序遍历 广搜 BFScollections双端队列 deque剑指 Offer 32 - II. 从上到下打印二叉树 II剑指 Offer 32 - III. 从上到下打印二叉树 III剑指 Offer 32 - I. 从上到下打印二叉树 题;从上到下打印出二叉树的每个节点&#xff0c…

单通道说话人语音分离——DPRNN(Dual-Path Recurrent Neural Network)

参考文献&#xff1a;《DUAL-PATH RNN: EFFICIENT LONG SEQUENCE MODELING FOR TIME-DOMAIN SINGLE-CHANNEL SPEECH SEPARATION》 DPRNN网络是Con-Tasnet的改进网络 Con-Tasnet介绍详情请看上一篇文章 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio…

应用程序性能优化方案,web服务五级缓存优化,服务器性能优化...

winfrom 全局异常捕获WPF 全局异常捕获Asp.Net全局异常捕获MVC 全局异常捕获AspNetNetCore 全局异常捕获一级缓存html/css/js 前端缓存二级缓存Asp.Net MVC AspNetCore 客户端缓存设置三级缓存服务端缓存四级redis 数据库缓存服务端缓存五级sqlserver 数据库缓存设置分布式缓存…

2023年湖北建设厅资料员证怎么考需要什么条件?启程别

2023年湖北建设厅资料员证怎么考需要什么条件&#xff1f;启程别 湖北资料员目前已经开始组织考试了&#xff0c;各位想要考资料员的现在可以开始准备报考相关准备工作了。资料员怎么考需要什么条件&#xff1f;启程别告诉你 建设厅资料员证怎么考 网报&#xff1a;七大员全国…

ARM学习(十八)jinkozone调试问题总结

笔者来聊聊ARM的函数的调用规则 1、ARM函数调用规则介绍首先介绍几个术语&#xff0c; AAPCS&#xff1a;Procedure Call Standard for the ARM Architecture APCS&#xff1a;ARM Procedure Call Standard TPCS&#xff1a;Thumb Procedure Call Standard ATPCS&#xff1a;AR…

5.3 redis分布式锁【Java 面试第三季】

redis分布式锁【Java 面试第三季】前言推荐redis分布式锁概览47_redis分布式锁前情说明48_boot整合redis搭建超卖程序-上49_boot整合redis搭建超卖程序-下50_redis分布式锁0151_redis分布式锁0252_redis分布式锁0353_redis分布式锁0454_redis分布式锁0555_redis分布式锁0656_re…

【Java|golang】2363. 合并相似的物品---桶排序

给你两个二维整数数组 items1 和 items2 &#xff0c;表示两个物品集合。每个数组 items 有以下特质&#xff1a; items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 &#xff0c;weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一的 。 请你…

报名投票链接怎么做做一个投票的链接怎么做微信投票链接怎么做

近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非常大的优势。1.它比起微信公众号自带的投票系统、传统的H5投票系统有可以图…

案例|政务大数据平台数据安全建设实践

《关于加强数字政府建设的指导意见》、《全国一体化政务大数据体系建设指南》&#xff0c;对全面开创数字政府建设新局面作出部署&#xff0c;保障数据安全&#xff0c;提升数字政府基础设施的支撑能力&#xff0c;也明确成为数字政府建设探索与实践中的重点任务。那么&#xf…

王道计算机网络课代表 - 考研计算机 第五章 传输层 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机网络 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “传输层” 章节知识点总结的十分全面&#xff0c;涵括了《计算机网络》课程里的全…

klee内存模型

klee内存模型一.LLVM基础二.Klee中相关的类2.1.基础类2.2.内存管理相关类三.示例3.1.示例13.2.示例23.3.示例33.4.示例4这篇blog主要通过一些简单的示例来了解以下klee对内存的建模方式。 首先一个C语言程序在运行时&#xff0c;内存主要包括&#xff1a; 代码段&#xff0c;程…

如何从零到一的设计一套轻易云数据集成平台这样的系统架构

一个集成平台的架构设计需要考虑多个方面&#xff0c;包括系统架构、技术选型、数据存储、安全设计等。下面是参考轻易云数据集成平台的架构设计思路&#xff1a;系统架构首先需要确定系统的整体架构&#xff0c;这包括前后端分离、微服务架构、容器化部署等。根据需求和规模的…

老字号白酒企业——金徽酒借力泛微,升级门户,实现统一办公

金徽酒股份有限公司前身系康庆坊、万盛魁等多个徽酒老作坊基础上组建的省属国营大型白酒企业&#xff0c;曾用名甘肃陇南春酒厂&#xff0c;是国内建厂最早的中华老字号白酒酿造企业之一。2016年3月10日&#xff0c;金徽酒在上海证券交易所挂牌上市。 &#xff08;图片素材来自…

Airbnb(三) Managing Diversity in Airbnb Search 搜索多样性

abstract 搜索系统中一个长期的问题是结果多样性。从产品角度讲&#xff0c;给用户多种多样的选择&#xff0c;有助于提升用户体验及业务指标。 多样性需求和模型的目标是相矛盾的&#xff0c;因为传统ctr模型是 point wise&#xff0c;只看单个相关性不管相邻之间item差异。 …

字节前端一面常见vue面试题(必备)

Vue为什么没有类似于React中shouldComponentUpdate的生命周期 考点: Vue的变化侦测原理前置知识: 依赖收集、虚拟DOM、响应式系统 根本原因是Vue与React的变化侦测方式有所不同 当React知道发生变化后&#xff0c;会使用Virtual Dom Diff进行差异检测&#xff0c;但是很多组件…

如何顺利渡过三月“大考”?ScanV为您献上“通关秘籍”

随着网络安全形势日益复杂、严峻&#xff0c;在重大安全保障事件期间&#xff0c;重要业务系统&#xff0c;尤其是党政机关、国企央企、能源、金融等重要的关基单位更应重视网站及业务系统安全。 临近三月重保季&#xff0c;知道创宇推出“御黑行动-典型案例篇”&#xff0c;以…