位置: 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微调)

  • 腾讯视频竖屏怎么调成横屏(腾讯视频竖屏怎么变横屏)

    腾讯视频竖屏怎么调成横屏(腾讯视频竖屏怎么变横屏)

  • steam怎么改手机号(steam怎么改手机号原来手机号用不了了)

    steam怎么改手机号(steam怎么改手机号原来手机号用不了了)

  • 苹果se2屏幕多大尺寸(苹果11pro 屏幕多少寸)

    苹果se2屏幕多大尺寸(苹果11pro 屏幕多少寸)

  • 6.1寸手机有哪些(安卓6.1寸手机有哪些)

    6.1寸手机有哪些(安卓6.1寸手机有哪些)

  • 手机qq视频聊天怎么关闭自己的声音(手机QQ视频聊天怎么设置满屏)

    手机qq视频聊天怎么关闭自己的声音(手机QQ视频聊天怎么设置满屏)

  • 华为怎么设置三个按钮(华为怎么设置三秒拍照)

    华为怎么设置三个按钮(华为怎么设置三秒拍照)

  • vr ar技术是什么(vr,ar技术是指什么)

    vr ar技术是什么(vr,ar技术是指什么)

  • i34130配什么主板(i34130配什么主板最好)

    i34130配什么主板(i34130配什么主板最好)

  • 数据库系统和数据库管理系统的区别(数据库系统和数据库管理系统的关系)

    数据库系统和数据库管理系统的区别(数据库系统和数据库管理系统的关系)

  • 苹果11的重量(苹果11的重量是多少)

    苹果11的重量(苹果11的重量是多少)

  • 苹果手机微信支付无法使用怎么解决(苹果手机微信支付管理在哪里)

    苹果手机微信支付无法使用怎么解决(苹果手机微信支付管理在哪里)

  • 小程序设为群待办有什么用(群小程序在哪里设置)

    小程序设为群待办有什么用(群小程序在哪里设置)

  • 小米鼠标电池能用多久(小米鼠标电池能换吗)

    小米鼠标电池能用多久(小米鼠标电池能换吗)

  • 天猫魔盒复位键在哪里(天猫魔盒复位键没反应)

    天猫魔盒复位键在哪里(天猫魔盒复位键没反应)

  • 小米9怎么开启wlan热点(小米9怎么开启无线反向充电)

    小米9怎么开启wlan热点(小米9怎么开启无线反向充电)

  • 华为p30怎么拍星星(华为p30怎么拍星空夜景)

    华为p30怎么拍星星(华为p30怎么拍星空夜景)

  • 爱奇艺怎么查看登录记录(爱奇艺怎么查看登陆了几个设备)

    爱奇艺怎么查看登录记录(爱奇艺怎么查看登陆了几个设备)

  • 小米8怎么设置来电转接(小米8怎么设置屏幕)

    小米8怎么设置来电转接(小米8怎么设置屏幕)

  • 小米8是快充还是闪充呢(小米8用快充好还是慢充好)

    小米8是快充还是闪充呢(小米8用快充好还是慢充好)

  • 苹果6.1.3系统怎么装微信(苹果6.1.3系统怎么装软件)

    苹果6.1.3系统怎么装微信(苹果6.1.3系统怎么装软件)

  • 微信悬浮窗口怎么设置(微信悬浮窗口怎么调节大小)

    微信悬浮窗口怎么设置(微信悬浮窗口怎么调节大小)

  • css三角和css 用户见面样式,vertical-align 属性应用,溢出的文字省略号显示,常见布局技巧(css做三角)

    css三角和css 用户见面样式,vertical-align 属性应用,溢出的文字省略号显示,常见布局技巧(css做三角)

  • 工程结算时如何确认收入
  • 分期付款发票开具
  • 小规模纳税人税费会计分录
  • 取得住宿发票的专用发票可以抵扣吗
  • 所得税费用在利润表中应在税金及附加项目中填列
  • 接受劳务是进项还是销项
  • 个税申报截止日期2023年8月
  • 结转损益类费用科目的余额
  • 会计成本核算工作内容
  • 现金日记账根据哪些凭证登记
  • 承租人与出租人签订了一份租赁合同,该设备
  • 转移性支付收入是什么
  • 固定资产投资转化为gdp比例
  • 打样费单位是什么
  • 资金不需要验资,实收资本怎么入账
  • 绿化企业所得税税率是多少
  • 分公司背书给总公司
  • 增值税专用发票电子版
  • 什么是销售利润率和成本利润率
  • 长期股权投资用交印花税吗
  • 分担总部费用
  • 公司买的油烟机可以抵扣进项税吗
  • 跨年的发票可以补开吗
  • 广告业文化事业建设费2023标准
  • 超市收代金券如何处理
  • 应收账款产生的利息分录
  • 小额纳税人进口增值税适用税率?
  • 毛利率与净利率的差额
  • 生物制品的生产过程及设备
  • 计提小规模增值税怎么做账
  • php简单实例
  • elementui ts
  • php转换字符编码
  • php检测是否登录
  • 公司已经注销了还能劳动仲裁吗
  • 索洛维茨在哪
  • 发票复核和收款人未填写
  • thinkphp saveall
  • 出售其他债权投资差额计入
  • 老老实实的人
  • blockdata指令怎么用
  • 勾选认证客户端不成功怎么办
  • php引用类型
  • 减免增值税计入营业外收入影响利润
  • 增值税要计入应收账款吗
  • 土地使用权转为在建工程
  • 公司印章样子
  • 资产负债表中的货币资金包括哪些
  • 印花税实际缴纳时计入
  • 本月销售商品会计分录
  • 企业代扣的个人所得税款收入属于哪个会计科目
  • 借款收据怎样才有法律效力
  • mysql 死锁解决
  • window 启动
  • Windows XP中网桥设置方法
  • ubuntu听音乐
  • windows注册账号
  • win10开机出现microsoft
  • win8怎么开机不用密码
  • 水下摄影技巧
  • Android Eclipse 项目报错,但没有显示具体错的代码位置
  • exception继承
  • python pyo
  • nodejs 异步io底层原理
  • win2000停止服务
  • 用css制作网页的步骤
  • js document.cookie
  • android调用相机闪退
  • 用vue做项目加入购物车是怎么做到的
  • node的理解
  • android插件化原理面试
  • jQuery实现获取table表格第一列值的方法
  • jquery validator
  • json convert
  • android权限管理
  • 细说javascript
  • jQuery AJAX timeout 超时问题详解
  • 江苏省地方税务局网上办税
  • 国税新人什么时候入职
  • 江苏省国家税务局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设