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

这篇具有很好参考价值的文章主要介绍了vue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

neo4j是什么?

简单来说,这是一种比较热门的图数据库,图数据库以图形形式存储数据。 它以节点,关系和属性的形式存储应用程序的数据。 一个图由无数的节点和关系组成。
安装图数据库在这里就不介绍了,本篇主要介绍如何连接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-driver

再页面中引入

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://download.csdn.net/download/qq_41859063/86246454?spm=1001.2014.3001.5503。文章来源地址https://www.toymoban.com/news/detail-785780.html

到了这里,关于vue+neo4j +纯前端(neovis.js / neo4j-driver) 实现 知识图谱的集成 大干货--踩坑无数!!!将经验分享给有需要的小伙伴的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Neo4j是什么,为什么需要Neo4j,Neo4j的优势和应用场景

    当我们处理非常复杂的数据时,传统的关系型数据库可能会无法胜任。而在这种情况下,一个基于图形数据模型的数据库,如Neo4j,可能会是更好的选择。Neo4j是一个高性能、面向对象的图形数据库,它是为存储和查询大规模图形数据而设计的。 在Neo4j中,数据被组织成一系列

    2024年02月08日
    浏览(49)
  • 【neo4j】neo4j的安装与使用

    https://www.oracle.com/java/technologies/downloads/ 按照步骤安装即可 配置环境变量 在系统变量中添加 path变量中添加 https://neo4j.com/deployment-center/ 下载后,在指定位置解压缩 与java相同,也需要设置环境变量。 终端输入neo4j.bat console 成功

    2024年02月03日
    浏览(59)
  • Neo4j:入门基础(二)~ 数据导入Neo4J

    neo4j导入数据的方式有以下几种: Cypher create 语句,为每一条数据写一个create Cypher load csv 语句,将数据转成CSV格式,通过LOAD CSV读取数据。 neo4j-admin import导入 官方提供的Java API - BatchInserter 大牛编写的 batch-import 工具 neo4j-apoc load.csv + apoc.load.relationship 针对实际业务场景,定制

    2024年02月09日
    浏览(57)
  • springboot+elasticsearch+neo4j+vue+activiti数字知识库管理系统

    在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等。针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电子化管理显得尤为重要。 【springboot+elasticsearch+neo4j+v

    2024年02月09日
    浏览(51)
  • 【neo4j忘记密码】neo4j忘记密码的处理方法

    小伙伴们大家好,我是javaPope,因为最近想要构建知识图谱,突然想起自己还安装过neo4j,当我满怀欣喜启动以后却发现,忘记密码了,呜呜呜,然后,废话不多说,怎们直接上教程: 找到neo4j.config文件,路径如下(以自己为准): D:neo4jconfneo4j.conf 将 dbms.security.auth_enable

    2024年02月11日
    浏览(47)
  • Neo4j | 保姆级教学之如何清空neo4j数据库

    要清空neo4j数据库,需要进行以下操作: 停止Neo4j服务器,关闭Neo4j的所有连接。 找到 Neo4j 数据库存储的目录,通常是 data/databases/ 。 删除该目录中的所有文件和子目录。 请注意,这将不可逆地删除数据库的所有内容,包括节点、关系和属性等数据。在执行这个操作之前,请

    2024年02月06日
    浏览(53)
  • neo4j网页无法打开,启动一会儿后自动关闭,查看neo4j status显示Neo4j is not running.

    公司停电,服务器未能幸免,发现无法访问此网站,http://0.0.0.0:7474 在此之前都还好着 发现neo4j启动后几秒自动挂掉 查看neo4j的报错日志 得到以下内容(缩减版) 错误信息 “User limit of inotify watches reached” 表明系统达到了 Linux 内核对 inotify 监控事件的限制。inotify 是 Linux 内

    2024年04月11日
    浏览(48)
  • 头歌-Neo4j 的安装部署-第1关:安装 Neo4j(超详细)

     将解压包解压后开始第二步:修改配置文件:  接着修改第75行代码,如下图:  启动 Neo4j 复制下列网址,并打开Fire Fox,输入: 一开始默认账号密码都neo4j: 随后即可修改密码,账号密码都为123456,如下图:

    2024年02月07日
    浏览(277)
  • 毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言

    资源链接:https://download.csdn.net/download/m0_46573428/87796553 前言:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前言_人工智能技术小白修炼手册的博客-CSDN博客 首页与导航:毕业设计:Vue3+FastApi+Python+Neo4j实现主题知识图谱网页应用——前端:首页与导航栏_人工智

    2024年02月14日
    浏览(48)
  • neo4j community用neo4j.bat命令启动时遇到的困难

    1. neo4j : 无法将“neo4j”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次 用powershell和cmd运行都报错,此时是neo4j环境变量未配置成功的问题,需要多次删除并新建NEO4J_HOME才有效; 2.无法加载文件 D:n

    2024年04月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包