neo4j+echarts 绘制关系图(前端直接操作数据库)

 首先了解一下neo4j是干什么的 (提供给我们可以直接操作数据库的一个插件)下面是官网
Neo4j Aura

话不多说直接上代码

<template>

  <div style="width:100vw;height:100vh">

    <div

      ref="graph"

      style="width:100vw;height:100vh"

    >

    </div>

  </div>

</template>

<script>

export default {

  data () {

    return {

      // 绘制知识图谱的节点数据

      echartsData: [],

      nodesRelation: [],

      echartsNode: [],

      // 防止出现多个echarts初始化的情况

      myChart: '',

      options: {},

    }

  },

  mounted () {

    this.searchGraph()

  },

  methods: {

    async searchGraph () {

      const neo4j = require('neo4j-driver')

      const uri = ''; //ip地址

      const user = ''; //账号

      const password = '';//密码

      const driver = neo4j.driver(uri, neo4j.auth.basic(user, password))

      const session = driver.session({ database: 'neo4j' })



      try {

        // const readQuery1 = `MATCH (n:Person)  RETURN n.name AS name `

        const readQuery2 = `MATCH p=()-->() RETURN p`

        // const readQuery = `MATCH (p:Person)

        //               WHERE p.name = $personName

        //               RETURN p.name AS name`

        var me = { records: [] }

        const result = await session.run(readQuery2, {})

        me.records = 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);

        var options = {}

        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,

              type: "graph",

              layout: "force",

              zoom: 0.6,

              symbolSize: 60,

              // 节点是否可以拖动

              draggable: true,

              roam: true,

              hoverAnimation: false,

              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.echartsData,

              links: this.nodesRelation,

              // categories: this.categories

            }

          ]

        }

        console.log(this, 66633);

        //节点自定义拖拽不回弹

        this.myChart = this.$echarts.init(this.$refs.graph);

        const chart = this.myChart;

        this.myChart.setOption(options);

        chart.on('mouseup', function (params) {

          var option = chart.getOption();

          option.series[0].data[params.dataIndex].x = params.event.offsetX;

          option.series[0].data[params.dataIndex].y = params.event.offsetY;

          option.series[0].data[params.dataIndex].fixed = true;

          chart.setOption(option);

        });

      } catch (error) {

        console.error('Something went wrong: ', error)

      } finally {

        // await session.close()

      }

    },

  }

}

</script>

<style lang='less'  scoped>

</style>

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Neo4j是一种数据库,它可以嵌入到前端中使用。嵌入Neo4j前端的过程可以通过以下几个步骤实现。 首先,我们需要在前端项目中引入Neo4j的JavaScript驱动程序。Neo4j提供了官方的JavaScript驱动程序,我们可以通过npm或者cdn引入该驱动程序。 然后,我们需要在前端中建立与Neo4j数据库的连接。使用Neo4j提供的驱动程序,我们可以通过指定Neo4j数据库的URL、用户名和密码来建立连接。 连接建立后,我们可以使用Cypher查询语言与Neo4j进行交互。Cypher是Neo4j的查询语言,它可以用于查询、创建、更新和删除数据库中的数据。通过编写Cypher查询语句,我们可以在前端中执行这些查询,并获取处理结果。 在前端中使用Neo4j可以实现许多有趣的功能。例如,我们可以通过查询数据库中的数据,实现社交网络的关注关系展示;或者利用数据库的连接关系特性,构建一些形化的数据可视化工具。 然而,我们需要注意在前端中使用嵌入式Neo4j时的性能和安全性问题。由于Neo4j是一个较重的数据库,处理复杂查询时可能会影响前端的性能。因此,我们需要合理优化查询,并在前端中使用适当的缓存机制来减轻数据库的负荷。此外,为了保护数据库的安全,我们需要在前端中实施访问控制措施,限制用户对数据库操作权限。 总结而言,Neo4j可以被嵌入到前端中使用,并通过连接数据库、执行Cypher查询等方式实现与数据库的交互。在使用嵌入式Neo4j时,我们需要考虑性能和安全性问题,以便在前端中实现高效且安全的数据库应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值