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

  • 公司账户转账给个人怎么合理避税?
  • 缴纳个人所得税怎么算
  • 可供出售金融资产和长期股权投资
  • 小规模纳税人应交增值税怎么算
  • 公司抬头的发票
  • 航天金税的服务费如何抵扣
  • 出口企业免抵税额要作进项转出吗
  • 加盟店如何缴税
  • 发票领回来了怎么读入发票
  • 成本少结转了怎么调回
  • 客户想免费拿样
  • 营改增账务处理实例
  • 什么是股息红利扣税
  • 财税〔2017〕39号
  • 支票只能同城吗
  • 营改增后的税率
  • 企业所得税是根据什么申报的
  • 附加税是按照应交增值税还是已交
  • 固定资产丢失进项税需要转出吗
  • 退多收款怎么做分录
  • vue router
  • 一条指令可以完成一项复杂任务吗
  • thinkphp withjoin
  • php 5
  • 关停所有swap分区的命令
  • 微信小程序怎么制作自己的小程序
  • php guzzle 异步
  • 借款存入银行会计分录怎么写
  • 研发支出资本化支出属于什么科目
  • 在岗职工平均工资和社平工资的区别
  • 业务招待费的报销额度是多少
  • 石油预付款发票怎么开
  • 上一年度的费用退回清算表怎么填
  • 互联网+文本格式
  • mongodb管理工具
  • php7安装mysqli扩展
  • dedecms主页修改
  • 织梦发布文章栏目怎么不显示
  • python uppercase函数
  • 一直暂估原材料有什么风险
  • 融资租赁的种类
  • 企业亏损了
  • SQL Server 2008用'sa'登录失败,启用'sa'登录的解决办法
  • 研发辅助账汇总表
  • 股票的主要种类及其相应的功能
  • 背书是什么含义
  • 住房公积金是怎么来的?
  • 金蝶低值易耗品报废操作
  • 以前年度损益调整怎么做账
  • 会计分录如何分配利润
  • 开出增值税发票确认收入分录?
  • 土地测绘费计入开发间接费?
  • 个体工商户生产经营所得税优惠政策
  • 研发和技术服务属于什么大类
  • 收到银联代收短信
  • 工资油补也要交税吗
  • 建筑总包收到劳务合同
  • 退回拨款会计分录怎么做
  • mysql深入解析
  • hyper v虚拟机
  • 网页提示堆栈溢出怎么解决
  • windows xp的设备管理器在哪
  • ubuntu2004分区教程
  • 教程图解
  • armcc.exe
  • nodejs使用视频教程
  • opengl多窗口绘图
  • 猫的猫的视频
  • 使用jquery实现的项目
  • linux程序打包和安装
  • javascript视频教程
  • unity5用什么语言
  • 使用JQuery中的trim()方法去掉前后空格
  • python web ui
  • 天津电子税务局ca证书
  • 税务分局长级别
  • 农机免税范围
  • 如何查询票据真伪信息
  • 推进社会治理的路径
  • 利润表研发费用项目应根据管理费用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设