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

  • opporeno6电池容量多大(opporeno6电池容量在哪里看)

    opporeno6电池容量多大(opporeno6电池容量在哪里看)

  • 手机快手怎么投屏到电视(手机快手怎么投屏)

    手机快手怎么投屏到电视(手机快手怎么投屏)

  • 台式电脑安装无线网卡后启动不了(台式电脑安装无线接收器)

    台式电脑安装无线网卡后启动不了(台式电脑安装无线接收器)

  • 苹果xs屏幕什么水平(iphone xs屏幕是什么)

    苹果xs屏幕什么水平(iphone xs屏幕是什么)

  • 抖音极速版为什么拍不了视频(抖音极速版为什么不能支付宝提现了)

    抖音极速版为什么拍不了视频(抖音极速版为什么不能支付宝提现了)

  • 快手签名认证失败怎么回事(快手签名认证失败)

    快手签名认证失败怎么回事(快手签名认证失败)

  • 在powerpoint中页面设置可以(在powerpoint中页面比例的默认值为)

    在powerpoint中页面设置可以(在powerpoint中页面比例的默认值为)

  • 爆米花视频怎么搜索不了(爆米花视频怎么没有搜索功能)

    爆米花视频怎么搜索不了(爆米花视频怎么没有搜索功能)

  • 微信里emm表情什么意思(微信表情emm是什么)

    微信里emm表情什么意思(微信表情emm是什么)

  • 淘宝抢东西其中有一件失效(淘宝抢东西其中有一件失效影响付款吗)

    淘宝抢东西其中有一件失效(淘宝抢东西其中有一件失效影响付款吗)

  • 储存容量1gb等于多少(储存容量1gb等于多少g)

    储存容量1gb等于多少(储存容量1gb等于多少g)

  • 腾讯视频会员刚开通能退吗(腾讯视频会员刚购买取消自动续费)

    腾讯视频会员刚开通能退吗(腾讯视频会员刚购买取消自动续费)

  • 为什么截屏的图片发出去是模糊的(为什么截屏的图片显示不出来)

    为什么截屏的图片发出去是模糊的(为什么截屏的图片显示不出来)

  • 阿里巴巴的淘小铺是怎么回事(阿里巴巴淘小二)

    阿里巴巴的淘小铺是怎么回事(阿里巴巴淘小二)

  • 无线网络显示不出来怎么办(无线网络显示不在范围内怎么办)

    无线网络显示不出来怎么办(无线网络显示不在范围内怎么办)

  • 微信空白消息咋弄的(微信空白消息咋发)

    微信空白消息咋弄的(微信空白消息咋发)

  • vivo手机怎么设置锁屏(vivo手机怎么设置字体大小)

    vivo手机怎么设置锁屏(vivo手机怎么设置字体大小)

  • 滴滴怎么绑定学生证(如何绑定滴滴打车平台)

    滴滴怎么绑定学生证(如何绑定滴滴打车平台)

  • 手机图片上的文字怎么修改(手机图片上的文字怎么去掉不影响图片)

    手机图片上的文字怎么修改(手机图片上的文字怎么去掉不影响图片)

  • 删除访客记录对方能看到吗(删访客记录会改变访客数量吗)

    删除访客记录对方能看到吗(删访客记录会改变访客数量吗)

  • oracle exp导出表(oracle导出excel文件)

    oracle exp导出表(oracle导出excel文件)

  • 红包已被领取怎么删除(红包已领取怎么删除)

    红包已被领取怎么删除(红包已领取怎么删除)

  • 1050和1650区别(1050和1650的差别)

    1050和1650区别(1050和1650的差别)

  • 苹果的carplay怎么用(苹果的carplay怎么下载)

    苹果的carplay怎么用(苹果的carplay怎么下载)

  • WPS文字如何改变文字方向(wps文字怎么改变文字方向)

    WPS文字如何改变文字方向(wps文字怎么改变文字方向)

  • 小米8se微信视频怎么美颜(小米8se微信视频美颜怎么设置)

    小米8se微信视频怎么美颜(小米8se微信视频美颜怎么设置)

  • 苹果自定义运营商名字(苹果自定义运营商名称个性)

    苹果自定义运营商名字(苹果自定义运营商名称个性)

  • 苹果触控id无法使用(苹果触控id无法使用怎么办)

    苹果触控id无法使用(苹果触控id无法使用怎么办)

  • 华为mate20黑屏显示时间日期(mate20突然黑屏)

    华为mate20黑屏显示时间日期(mate20突然黑屏)

  • 苹果电脑隐藏软件教程(苹果电脑隐藏软件功能怎么开启)

    苹果电脑隐藏软件教程(苹果电脑隐藏软件功能怎么开启)

  • 向职工支付困难证明材料
  • 应付销货方代垫运费计入什么科目
  • 当月销售次月开票怎么申报
  • 餐饮服务需要缴纳增值税吗
  • 科目错一题扣几分
  • 现金日记账本月合计的红线画法
  • 小规模纳税人增值税申报表怎么填
  • 税务1236600短信
  • 以前年度资产损失的追补什么意思
  • 金融企业计提的坏账准备金
  • 增值税代开扣款怎么报税?
  • 子公司给母公司开票
  • 税务机关是否可以申请破产清算
  • 非正常工资的个税是多少
  • 一般纳税人运费计入什么科目
  • 个人机械租赁费税率
  • 公司购买宿舍楼申请书
  • 异地业务操作
  • 个人所得税福利费免税范围
  • 发票红冲需要用发票打印吗
  • 预付的费用没有还没有收到发票
  • 已付款收货未收到发票会计分录
  • 代征税款手续费规定
  • 发票的校验码被公章覆盖了怎么办
  • 建筑队能开哪些项目
  • 企业所得税季报人数怎么填
  • win11发热严重怎么解决
  • 应收账款期末怎么算
  • 法人个人账户收钱算不算公司收钱
  • php中常用的数组是什么
  • win7系统还原系统保护关闭
  • 桌面级cpu天梯图快科技
  • 分公司收到总公司拨款怎么做分录
  • h5移动端上传pdf
  • 涉税服务实务重点总结
  • 手机客户端app使用
  • PHP:is_dir()的用法_Filesystem函数
  • 违约金要计入应纳税所得额吗
  • 员工报销个人抬头的医疗费打款备注写什么
  • 企业重组特殊性税务处理计税基础
  • 行政事业单位 银行
  • yolov3原理及代码解析
  • defaultpool
  • timedatectl命令用法
  • 接受捐赠收入要交企业所得税吗
  • dedecms进入数据库
  • 织梦可以放两个模板吗
  • 快递公司账务处理流程及方法总结
  • 固定资产投资额是指什么
  • PostgreSQL教程(十七):客户端命令(1)
  • 固定资产净残值和净值的区别
  • 原材料的对应账户有哪些
  • 增值税普通发票和专用发票有什么区别
  • 建筑业简易计税预交
  • 政府会计双核算模式的好处
  • 生产企业购进的生产原材料用来装修公司会计处理
  • 低于注册资本转股怎么办
  • 工程中标费用放哪个科目
  • 实际发放工资的会计处理
  • 库存商品属于资产类科目吗
  • 普通发票作废如何操作
  • 企业收到补贴资金怎么办
  • 蓝字发票认证怎么操作
  • Windows10下MySQL5.7.19安装教程 MySQL忘记root密码修改方法
  • mysql kill -9
  • 联想笔记本在bios关闭触摸板
  • windows2003企业版sp2密钥
  • centos挂载点
  • 电脑右下角windows设置在哪
  • windows 7光盘
  • redhat本地yum配置的基本步骤
  • unity serial number
  • nodejs stdin
  • [置顶]bilinovel
  • promise实例方法
  • css下margin、padding、border、background和font缩写示例
  • shell 数组操作
  • android自定义组件开发详解
  • python类的理解
  • 动员讲话简短精辟
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设