位置: IT常识 - 正文

vue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴(vue.js前端)

编辑:rootadmin
vue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴 vue+neo4j+(neovis.js / neo4j-driver)纯前端实现知识图谱的集成neo4j是什么?一、Neovis.js 不用获取数据直接连接数据库绘图二、vis.js 或者 echarts绘图1、(发现一个神器) neo4j-driver 能够直接通过前端获取数据。2、使用echarts绘图3、使用vis.js绘图neo4j是什么?

推荐整理分享vue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴(vue.js前端),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue前端部署流程,前端vue后端node,neo4j 前端展示,vue.js前端,neo4j 前端展示,neo4j 前端展示,前端vue后端node,前端vue后端node,内容如对您有帮助,希望把文章链接给更多的朋友!

简单来说,这是一种比较热门的图数据库,图数据库以图形形式存储数据。 它以节点,关系和属性的形式存储应用程序的数据。 一个图由无数的节点和关系组成。 安装图数据库在这里就不介绍了,本篇主要介绍如何连接neo4j数据库,将知识图谱成功显示在前端页面中。

一、Neovis.js 不用获取数据直接连接数据库绘图

1.、 Neovis.js与Neo4j的连接非常简单明了,并且Neovis 的数据格式与那neo4j数据库保持一致。在单个配置对象中定义标签、属性、节点和关系的样式和颜色。

首先下载依赖

npm install -save neovis.js

在项目中引用

import NeoVis from 'neovis.js';

创建用来绘图的DOM元素

<div style="height:100%;" ref="Screen"> <div class="left" id="viz1" ref="viz1"></div> </div> -->

页面加载进来调用draw()画图函数

mounted() { this.draw(); }, //neovis.js画图 methods:{ draw() { //获取dom元素 var viz1 = this.$refs.viz1; //创建veovis实例 var viz; //配置项 var config = { container_id: "viz", //neo4j服务器地址,用户名 和 密码 server_url: "bolt://192.x.xxx.10:7687", server_user: "nexx4j", server_password: "KGxxx34", **///labels是节点央样式的配置:** **/// caption :节点显示的文字对应内容 **/// community: 节点颜色** **/// size:节点大小** **/// font:节点字体大小设置**** **//没有在这个地方配置的节点将会是默认样式** labels: { "CITY": { caption: "name", community: "#5496FF", size: 200, font: { size: 35, color: "#606266", }, }, "基本待遇政策": { caption: "name", community: "#5496FF", size: 95, font: { size: 25, color: "#606266", } }, "基本筹资政策": { caption: "name", community: "#5496FF", size: 95, font: { size: 25, color: "#606266", }, }, }, **///relationships是关系线段样式的配置:** **/// caption :线段显示的文字对应内容 **/// thickness: 线段粗细** **/// font:节点字体大小设置**** **//没有在这个地方配置的线段将会是默认样式** relationships: { "待遇支付政策": { thickness: 1, caption: true, font: { size: 15, color: "#606266", }, }, "待遇主体类别": { thickness: "count", caption: true, font: { size: 15, color: "#606266", }, }, }, //是否显示箭头 arrows: true, hierarchical: true, // 分层结构或者默认 "hubsize"(默认)和"directed". // hierarchical_sort_method: 'hubsize', hierarchical_sort_method: 'directed', //配置数据库查询语句,MATCH n RETURN n,尝试过不对,必须用 MATCH p=()-->() RETURN p initial_cypher: 'MATCH p=()-->() RETURN p', }; viz = new NeoVis(config); viz._container = viz1; viz.render(); }, }二、vis.js 或者 echarts绘图由于这两者需要的数据格式与neo4j数据格式不同,所以需要先从前端获取数据,然后处理成我们需要的格式。1、(发现一个神器) neo4j-driver 能够直接通过前端获取数据。

上代码, 首先下载依赖

npm install -save neo4j-drivervue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴(vue.js前端)

再页面中引入

var neo4j = require("neo4j-driver");export default { ...此处暂时省略...}

页面初次加载调用 this.executeCypher() 执行 Cypher 查询数据

mounted() { var query= 'MATCH p=()-->() RETURN p' this.executeCypher(query); },

executeCypher()方法定义: 该方法处理的数据格式为echarts适用格式

/** * 直接执行Cypher */ executeCypher(query) { this.echartsNode = [] //节点数组 this.nodesRelation = [] //关系线数组 this.category = [] //echarts图例数据数 // 创建实例 this.driver = neo4j.driver('bolt://localhost:7687', neo4j.auth.basic('neo4j', 'KG****')); console.log("🚀 ~ file: AuthorArticleSearch.vue ~ line 46 ~ mounted ~ this.drive", this.driver) let me = this; me.records = []; this.clearAll = true; let session = this.driver.session(); if (query == "") return; session.run(query, {}).then((result) => { me.clearAll = false; me.records = result.records; console.log("neo4j 查询结果", result.records); session.close(); me.closeLoading(false); }).catch(function (error) { console.log("Cypher 执行失败!", error); me.driver.close(); }); }, closeLoading(status) { console.log('closeLoading', status); },

以上我们就查询到了数据,紧接着开始处理数据,首先处理成适用echarts的数据格式

2、使用echarts绘图

首先处理获取的数据

/** * 直接执行Cypher */ executeCypher(query) { this.echartsNode = [] //节点数组 this.nodesRelation = [] //关系线数组 this.category = [] //echarts图例数据数 // 创建实例 this.driver = neo4j.driver('bolt://localhost:7687', neo4j.auth.basic('neo4j', '******')); console.log("🚀 ~ file: AuthorArticleSearch.vue ~ line 46 ~ mounted ~ this.drive", this.driver) let me = this; me.records = []; this.clearAll = true; let session = this.driver.session(); if (query == "") return; session.run(query, {}).then((result) => { me.clearAll = false; me.records = result.records; console.log("neo4j 查询结果", result.records);// 开始处理数据 for (let i = 0; i < me.records.length; i++) { this.echartsData.push({ name: me.records[i]._fields[0].segments[0].start.properties.name, category: me.records[i]._fields[0].segments[0].start.labels[0] }); this.echartsData.push({ name: me.records[i]._fields[0].segments[0].end.properties.name, category: me.records[i]._fields[0].segments[0].end.labels[0] }); this.nodesRelation.push({ source: me.records[i]._fields[0].segments[0].start.properties.name, target: me.records[i]._fields[0].segments[0].end.properties.name, name: me.records[i]._fields[0].segments[0].relationship.type, }); } //删除arr中的重复对象 var arrId = []; var legend = []; for (var item of this.echartsData) { legend.push({ name: item.category }) if (arrId.indexOf(item.name) == -1) { arrId.push(item.name) this.echartsNode.push(item); } } this.category = Array.from(new Set(legend)) session.close(); me.closeLoading(false); }).catch(function (error) { console.log("Cypher 执行失败!", error); me.driver.close(); }); setTimeout(() => { this.knowlegGraphshow = true }, 4000); }, closeLoading(status) { console.log('closeLoading', status); },

echarts配置:

this.options = { tooltip: {//弹窗 show: false, // enterable: true,//鼠标是否可进入提示框浮层中 // formatter: formatterHover,//修改鼠标悬停显示的内容 }, legend: { type: 'scroll', orient: 'vertical', left: 10, top: 20, bottom: 20, data: this.category }, series: [ { categories: this.category, // categories: [{ // name: "筹资渠道" // }], type: "graph", layout: "force", zoom: 0.6, symbolSize: 60, // 节点是否可以拖动 draggable: true, roam: true, hoverAnimation: false, // labelLayout: { // hideOverlap: true, // }, legendHoverLink: false, nodeScaleRatio: 0.6, //鼠标漫游缩放时节点的相应缩放比例,当设为0时节点不随着鼠标的缩放而缩放 focusNodeAdjacency: false, //是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。 // categories: categories, itemStyle: { color: "#67A3FF", }, edgeSymbol: ["", "arrow"], // edgeSymbolSize: [80, 10], edgeLabel: { normal: { show: true, textStyle: { fontSize: 12, }, formatter(x) { return x.data.name; }, }, }, label: { normal: { show: true, textStyle: { fontSize: 12, }, color: "#f6f6f6", textBorderColor: '#67A3FF', textBorderWidth: '1.3', // 多字换行 formatter: function (params) { // console.log(params); var newParamsName = ""; var paramsNameNumber = params.name.length; var provideNumber = 7; //一行显示几个字 var rowNumber = Math.ceil(paramsNameNumber / provideNumber); if (paramsNameNumber > provideNumber) { for (var p = 0; p < rowNumber; p++) { var tempStr = ""; var start = p * provideNumber; var end = start + provideNumber; if (p == rowNumber - 1) { tempStr = params.name.substring(start, paramsNameNumber); } else { tempStr = params.name.substring(start, end) + "\n\n"; } newParamsName += tempStr; } } else { newParamsName = params.name; } return newParamsName; }, }, }, force: { repulsion: 200, // 节点之间的斥力因子。支持数组表达斥力范围,值越大斥力越大。 gravity: 0.01, // 节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。 edgeLength: 400, // 边的两个节点之间的距离,这个距离也会受 repulsion影响 。值越大则长度越长 layoutAnimation: true, // 因为力引导布局会在多次迭代后才会稳定,这个参数决定是否显示布局的迭代动画 // 在浏览器端节点数据较多(>100)的时候不建议关闭,布局过程会造成浏览器假死。 }, data: this.data, links: this.links, // categories: this.categories } ] }3、使用vis.js绘图

下载依赖:

npm install -s vis,js

引入:

//import Vis from "vis";const Vis = require('vis-network/dist/vis-network.min');require('vis-network/dist/dist/vis-network.min.css');

首先处理数据:

在这里插入代码片 /** * 直接执行Cypher */ executeCypher(query) { this.echartsNode = [] //节点数组 this.nodesRelation = [] //关系线数组 // 创建实例 this.driver = neo4j.driver('bolt://localhost:7687', neo4j.auth.basic('neo4j', 'KG****')); console.log("🚀 ~ file: AuthorArticleSearch.vue ~ line 46 ~ mounted ~ this.drive", this.driver) let me = this; me.records = []; this.clearAll = true; let session = this.driver.session(); if (query == "") return; session.run(query, {}).then((result) => { me.clearAll = false; me.records = result.records; console.log("neo4j 查询结果", result.records); // 开始处理数据 let nodes = new Set(); for (let i = 0; i < me.records.length; i++) { nodes.add(me.records[i]._fields[0].segments[0].start.properties.name); nodes.add(me.records[i]._fields[0].segments[0].end.properties.name); this.nodesRelation.push({ from: me.records[i]._fields[0].segments[0].start.properties.name, to: me.records[i]._fields[0].segments[0].end.properties.name, label: me.records[i]._fields[0].segments[0].relationship.type, id: i, }); } nodes.forEach((e) => { this.echartsData.push({ label: e, id: e, }); }) session.close(); me.closeLoading(false); }).catch(function (error) { console.log("Cypher 执行失败!", error); me.driver.close(); }); this.nodesArray = this.echartsData //节点数组 this.edgesArray = this.nodesRelation //关系线数组 setTimeout(() => { this.knowlegGraphshow = true }, 4000); }, closeLoading(status) { console.log('closeLoading', status); },

定义绘图dom元素

// width,height 画布的宽度,高度。 可以是百分比或像素,一般在dom元素上设置 --> <div v-if="knowlegGraphshow == true" id="network_id" ref="network_id" class="network" style="height: 100%;"> </div>

调用绘图方法:

// vis.js画图 visDraw() { let container = this.$refs.network_id; let data = { nodes: this.nodesArray, edges: this.edgesArray } console.log("🚀 ~ file: pageKnowlegGraph.vue ~ line 135 ~ visDraw ~ data", data) let options = { autoResize: true, // / 设置节点样式 nodes: { shape: "dot", size: 20, font: { //字体配置 size: 20 }, color: { // border: "#2B7CE9", //节点边框颜色 background: "#97C2FC", //节点背景颜色 highlight: { //节点选中时状态颜色 border: "#2B7CE9", background: "#D2E5FF" }, hover: { //节点鼠标滑过时状态颜色 border: "#2B7CE9", background: "#D2E5FF" } }, borderWidth: 0, //节点边框宽度,单位为px borderWidthSelected: 2 //节点被选中时边框的宽度,单位为px }, // 边线配置 edges: { width: 1, length: 260, color: { color: "#848484", highlight: "#848484", hover: "#848484", inherit: "from", opacity: 1.0 }, shadow: false, smooth: { //设置两个节点之前的连线的状态 enabled: false //默认是true,设置为false之后,两个节点之前的连线始终为直线,不会出现贝塞尔曲线 }, arrows: { to: true } //箭头指向to }, //计算节点之前斥力,进行自动排列的属性 physics: { // enabled: true, //默认是true,设置为false后,节点将不会自动改变,拖动谁谁动。不影响其他的节点 // barnesHut: { // gravitationalConstant: -4000, // centralGravity: 0.3, // springLength: 120, // springConstant: 0.04, // damping: 0.09, // avoidOverlap: 0 // }, }, // physics: false, //用于所有用户与网络的交互。处理鼠标和触摸事件以及导航按钮和弹出窗口 interaction: { hover: true, dragNodes: true, //是否能拖动节点 dragView: true, //是否能拖动画布 // hover: true, //鼠标移过后加粗该节点和连接线 // multiselect: true, //按 ctrl 多选 // selectable: true, //是否可以点击选择 // selectConnectedEdges: true, //选择节点后是否显示连接线 // hoverConnectedEdges: true, //鼠标滑动节点后是否显示连接线 zoomView: true //是否能缩放画布 }, }; this.network = new Vis.Network(container, data, options); },

源码已上传,需要的小伙伴可前往主页找到下载。

本文链接地址:https://www.jiuchutong.com/zhishi/299307.html 转载请保留说明!

上一篇:densenet的网络结构和实现代码总结(torch)(densenet网络结构详解)

下一篇:chatgpt微调fine-tuning(gmt微调)

  • 附加税填表说明
  • 主办会计跟会计有什么区别
  • 企业付房租怎么做会计分录
  • 金税四期怎么监控应收账款
  • 预付的成本票计入什么科目?
  • 京东开专用发票需要用公户付款吗
  • 应交税费贷方有余额,怎么销账
  • 对公账户取现金有限制吗
  • 企业年度财务报表主要包括
  • 不动产在建工程使用的外购物资可以抵扣吗
  • 公司预支了然后来报销的帐怎么做?
  • 固定资产附加的账务处理
  • 银行卡收到养老金是什么意思
  • 一般纳税人辅导期
  • 新三板公司股东人数
  • 直接融资租赁模式
  • 生育津贴公司账户怎么维护
  • 小规模纳税人三个月做一次账
  • 办公室房租属于什么费用
  • mac安装软件不用密码
  • mac上如何切换apple id
  • mac 10.14.1
  • 工伤认定方法有几种方式呢
  • 政策性专项资金包括哪些
  • win10插usb没有反应
  • linux相关命令及用法
  • 酒店没有营业执照开业员工有责任吗
  • 长期借款还款
  • php安装扩展fileinfo
  • element-ui dialog
  • 所有者权益期末减期初等于净利润还是利润总额
  • 供电局销售电力产品
  • 浏览器并发请求队列数量怎么设置
  • 房屋出租一定要签合同吗
  • php echo js
  • 微信小程序webview支付
  • php正则表达式匹配字符串
  • 现在用yii框架的人还多么
  • php保存session
  • 委托开发和购买开发
  • css样式修改
  • 收到银行存款利息计入什么科目
  • 社会团体税收政策
  • 可行性研究报告合同属于什么合同
  • 什么是付出对价的公允
  • 财政拨入的科技费是什么
  • 公司给员工租房进项税可以抵扣吗
  • 增值税发票超过3个月可以作废吗
  • 开票软件怎么增加开票员
  • 税务清单打印不全
  • 什么情况下核定应纳税额
  • SQL SERVER中关于exists 和 in的简单分析
  • 小规模季度开票不超过多少
  • 财政直接支付的概念
  • 评估价值高于账面价值怎么账务处理
  • 外币投资计入什么科目
  • 车辆报废取得的收入增值税怎么算
  • 增值税免税入账
  • 如何计提当期费用成本
  • 实收资本包括哪些项目
  • MySQL关键字执行顺序
  • sql语句删除语句
  • win8装不了itunes
  • mac自带中文输入法
  • 系统没有wmi服务选项
  • u盘安装win7系统教程图解
  • 桌面工具栏显示
  • unicode和utf–8 编码
  • js实现简单的画图功能
  • JQuery.validationEngine表单验证插件(推荐)
  • 性能优化实验
  • jquery和html的关系
  • 安卓手机管家推荐
  • unity vtext
  • android动画实现方式
  • python函数详解
  • 个税申报系统如何增加新单位
  • 深圳纳税信息查询
  • 国家税务总局大连电子税务局
  • 出口退税出现预缴怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设