知识图谱入门——11:构建动态图谱渲染应用:Vue3与Neo4j的集成与实践

news2024/12/23 13:10:56

在知识图谱与大数据技术领域,构建动态图谱是一项非常重要的任务。这篇博客将带你深入了解如何利用Vue.js、D3.js以及Neo4j,开发一个能够实时渲染图谱节点和关系的应用。我们将从零开始,介绍如何搭建开发环境、安装依赖、与Neo4j数据库交互、到最终的图谱可视化实现(为方便演示,服务端先不搭建)。

1. Vue项目脚手架的搭建

在开始之前,你可以选择自己搭建Vue项目,也可以使用这个我的的Vue3脚手架:HuYaochao的Vue3-simple-basic(github),是一个很简单且实用的项目模板,能快速开始你的上手。

我们首先克隆这个项目:

git clone https://github.com/HuYaochao/Vue3-simple-basic.git
cd Vue3-simple-basic

然后安装依赖:

npm i

2. Neo4j的安装与集成

接下来,我们需要在应用中集成Neo4j作为我们的数据库。Neo4j是一个基于图数据库的强大工具,适合用于存储与管理实体间复杂关系。可以从Neo4j官网下载安装它,并启动Neo4j服务。
具体流程可以看我这篇博客:知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)
并学习Cypher 查询语言,
进阶学习:知识图谱入门——6:Cypher 查询语言高级组合用法(查询链式操作、复杂路径匹配、条件逻辑、动态模式创建,以及通过事务控制和性能优化处理大规模数据。

在项目中,我们使用 neo4j-driver 来连接Neo4j数据库并执行查询。首先,安装Neo4j和d3驱动:

npm install neo4j-driver d3

安装完成后,neo4j-driver 用于连接和查询 Neo4j 数据库,d3 则用于图形的渲染。

3. 数据查询与D3.js的引入:分步骤实现与详解

为了方便理解,我将核心的 NeoGraph.vue 代码分成多个步骤进行详细讲解,并加上必要的注释。

Step 1: 模板部分

首先,我们需要定义HTML结构,确保有一个容器来渲染图形和迷你地图。

<template>
  <!-- 使用Element UI的卡片组件包裹整个图形区域 -->
  <el-card>
    <!-- 图谱渲染的主区域 -->
    <div id="graph"></div>
    <!-- 迷你地图区域,放置在右下角,帮助全局观察 -->
    <div id="miniMap" style="position: absolute; bottom: 10px; right: 10px;"></div>
  </el-card>
</template>

Step 2: 初始化Neo4j驱动并定义变量

我们需要通过Neo4j驱动来连接数据库,并定义存储节点和关系数据的变量。

<script setup lang="ts">
import { ref, onMounted } from 'vue'; // Vue的钩子函数和ref用于响应式变量
import neo4j from 'neo4j-driver'; // 导入Neo4j驱动
import * as d3 from 'd3'; // 导入D3.js用于图形渲染

// 使用Neo4j驱动创建数据库连接,替换为你的Neo4j用户名和密码
const driver = neo4j.driver(
  'bolt://localhost:7687', // 本地运行Neo4j的Bolt协议地址
  neo4j.auth.basic('neo4j', '12345678') // 替换为你的用户名和密码
);

// 定义存储节点和关系数据的响应式变量
const nodes = ref([]); // 存储节点的数组
const links = ref([]); // 存储关系(连接)的数组

Step 3: 使用 onMounted 钩子查询数据

onMounted 是Vue的生命周期钩子,当组件挂载后立即执行。在这里,我们连接Neo4j并查询数据库中的节点和关系数据。

onMounted(async () => {
  // 创建一个Neo4j会话
  const session = driver.session();
  
  try {
    // 执行Cypher查询,查找所有的节点和它们之间的关系
    const result = await session.run('MATCH (n)-[r]->(m) RETURN n, r, m');

    // 定义一个集合来存储唯一的节点
    const nodeSet = new Set();
    // 定义一个数组来存储连接数据
    const linkData = [];

    // 遍历查询结果,将节点和关系加入到集合和数组中
    result.records.forEach(record => {
      const node1 = record.get('n'); // 获取关系中的第一个节点
      const node2 = record.get('m'); // 获取关系中的第二个节点
      const relationship = record.get('r'); // 获取节点之间的关系

      // 使用Set保证节点唯一性,将节点加入Set中
      nodeSet.add({ id: node1.identity.toString(), label: node1.properties.name });
      nodeSet.add({ id: node2.identity.toString(), label: node2.properties.name });

      // 将关系加入到关系数组中,包含source和target节点
      linkData.push({
        source: node1.identity.toString(), // 关系的起始节点ID
        target: node2.identity.toString(), // 关系的终止节点ID
        type: relationship.type // 关系的类型(例如“朋友”、“同事”等)
      });
    });

    // 将Set转换为数组并赋值给nodes响应式变量
    nodes.value = Array.from(nodeSet);
    // 将连接数据赋值给links响应式变量
    links.value = linkData;

  } finally {
    // 关闭Neo4j会话
    await session.close();
  }

  // 数据加载完成后,调用渲染图形的函数
  renderGraph();
});

Step 4: 渲染图形并创建力导向图

通过D3.js渲染图形,并使用 d3.forceSimulation 创建力导向图布局,让节点和关系可以动态调整位置。

const renderGraph = () => {
  // 设置SVG的宽度和高度
  const width = 800;
  const height = 600;

  // 创建SVG元素,设置缩放功能
  const svg = d3.select('#graph') // 选择图形容器
    .append('svg') // 添加SVG元素
    .attr('width', width) // 设置SVG宽度
    .attr('height', height) // 设置SVG高度
    .call(d3.zoom().scaleExtent([0.5, 5]) // 设置缩放范围
      .on('zoom', (event) => { // 定义缩放事件
        g.attr('transform', event.transform); // 根据缩放事件调整图形
        updateMiniMap(); // 缩放时更新迷你地图
      }));

  // 在SVG中创建一个g元素,作为容器装载所有节点和关系
  const g = svg.append('g');
  const linkGroup = g.append('g').attr('class', 'links'); // 用于存储关系线的g元素
  const nodeGroup = g.append('g').attr('class', 'nodes'); // 用于存储节点的g元素

  // 使用力导向布局(force simulation)对节点和关系进行物理模拟
  const simulation = d3.forceSimulation(nodes.value) // 使用nodes.value中的节点数据
    .force('link', d3.forceLink().id(d => d.id).distance(100)) // 设置关系的距离
    .force('charge', d3.forceManyBody().strength(-200)) // 设置节点之间的排斥力
    .force('center', d3.forceCenter(width / 2, height / 2)) // 设置力导向图的中心位置
    .on('tick', () => { // 在每个tick(时间步)上更新节点和关系的位置
      // 更新关系线的位置
      linkGroup.selectAll('line')
        .data(links.value) // 使用links.value中的关系数据
        .join('line') // 绑定数据
        .attr('stroke', 'black') // 设置线的颜色
        .attr('stroke-width', 2) // 设置线的宽度
        .attr('x1', d => simulation.nodes().find(n => n.id === d.source).x) // 起点x
        .attr('y1', d => simulation.nodes().find(n => n.id === d.source).y) // 起点y
        .attr('x2', d => simulation.nodes().find(n => n.id === d.target).x) // 终点x
        .attr('y2', d => simulation.nodes().find(n => n.id === d.target).y); // 终点y

      // 更新节点的位置和外观
      nodeGroup.selectAll('circle')
        .data(nodes.value) // 使用nodes.value中的节点数据
        .join('circle') // 绑定数据
        .attr('r', d => Math.max(20, d.label.length * 8)) // 根据文本长度动态设置节点半径
        .attr('fill', 'blue') // 设置节点颜色
        .attr('cx', d => d.x) // 节点x坐标
        .attr('cy', d => d.y); // 节点y坐标

      // 在节点中心显示节点的标签(文本)
      nodeGroup.selectAll('text')
        .data(nodes.value) // 使用nodes.value中的节点数据
        .join('text') // 绑定数据
        .attr('x', d => d.x) // 文本的x坐标
        .attr('y', d => d.y + 5) // 文本的y坐标
        .attr('text-anchor', 'middle') // 文本居中
        .style('fill', 'white') // 文本颜色
        .text(d => d.label); // 文本内容
    });
};

Step 5: 迷你地图的实现

迷你地图可以帮助用户更好地浏览整个图谱的全局布局,尤其是当图谱变得较大时。

// 创建迷你地图
const miniMapSvg = d3.select('#miniMap') // 选择迷你地图的容器
  .append('svg') // 创建SVG元素
  .attr('width', 200) // 设置迷你地图的宽度
  .attr('height', 150); // 设置迷你地图的高度

// 在迷你地图中创建g元素
const miniMapGroup = miniMapSvg.append('g');

// 更新迷你地图的显示
const updateMiniMap = () => {
  // 清除现有的元素
  miniMapGroup.selectAll('*').remove();

  // 绘制关系线
  miniMapGroup.selectAll('line')
    .data(links.value) // 使用links.value中的关系数据
    .join('line') // 绑定数据
    .attr('stroke', 'gray') // 线的颜色
    .attr('stroke-width', 1) // 线的宽度
    .attr('

x1', d => simulation.nodes().find(n => n.id === d.source).x / 4) // 起点x坐标缩放
    .attr('y1', d => simulation.nodes().find(n => n.id === d.source).y / 4) // 起点y坐标缩放
    .attr('x2', d => simulation.nodes().find(n => n.id === d.target).x / 4) // 终点x坐标缩放
    .attr('y2', d => simulation.nodes().find(n => n.id === d.target).y / 4); // 终点y坐标缩放

  // 绘制节点
  miniMapGroup.selectAll('circle')
    .data(nodes.value) // 使用nodes.value中的节点数据
    .join('circle') // 绑定数据
    .attr('r', 5) // 设置节点半径
    .attr('fill', 'blue') // 节点颜色
    .attr('cx', d => d.x / 4) // 节点x坐标缩放
    .attr('cy', d => d.y / 4); // 节点y坐标缩放
};
</script>

4. 图形渲染与交互的实现

上面的代码展示了如何通过D3.js实现节点和关系的渲染,并结合 d3.forceSimulation 创建物理引擎的力导向布局。每个节点的大小是根据其文本长度动态调整的,确保即使是较长的名称也能在圆圈中完整显示。

通过 d3.zoom() 实现的缩放功能,让用户可以自由放大或缩小图谱。另外,通过右下角的小地图,用户能够查看整个图谱的全局布局,并且实时更新。
在这里插入图片描述

5. 结论

这篇博客完整呈现了如何使用Vue、D3.js和Neo4j来构建一个动态知识图谱渲染应用。从Vue项目的初始化,到Neo4j的查询与集成,再到图形的动态渲染与交互,每一个环节都为你提供了深度的技术讲解。通过这种方式,你可以轻松构建自己的知识图谱项目,并根据需要扩展更多复杂的图谱结构和交互功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2196043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

获取yolov8自带的数据集并开始训练

今天小编带大家学习一下YOLOv8 配置文件&#xff0c;用来定义不同数据集的参数和配置。这些文件包含了关于每个数据集的路径、类别数、类别标签等信息&#xff0c;帮助模型正确地加载和解析数据集&#xff0c;以便进行训练和推理。 具体来说&#xff0c;这些 YAML 文件的作用如…

各省份技术市场成交额数据(2001-2022年)

数据名称&#xff1a;各省份技术市场成交额数据数据年份&#xff1a;2001-2022年数据来源&#xff1a;《中国统计年鉴》字段说明&#xff1a; id&#xff1a;数据条目编号省份&#xff1a;中国各省份年份&#xff1a;2001-2022年技术市场成交额(万元)&#xff1a;表示该省份在特…

基于Springboot vue的流浪狗领养管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

Win10 IDEA连接虚拟机中的Hadoop(HDFS)

获取虚拟机的ip 虚拟机终端输入 ip a关闭虚拟机防火墙 sudo ufw disable修改Hadoop的core-site.xml文件 将localhost修改为虚拟机局域网IP # 位置可能不一样&#xff0c;和Hadoop安装位置有关 cd /usr/local/hadoop/etc/hadoop vim core-site.xmlIDEA 连接 创建Maven项目…

软考系统分析师知识点四:操作系统基本原理

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;33天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

如何删除或减少pagefile.sys?

您是否曾在计算机上遇到过一个名为 pagefile.sys 的超大文件&#xff1f; 许多 Windows 用户想知道 pagefile.sys 的用途以及如何在不影响系统性能的情况下有效地管理它。 本文将帮助您了解 pagefile.sys 是什么、它为什么会变大以及如何安全地管理它的大小。 什么是 pagefi…

基于UDP协议的网络通信

和TCP协议不同的是&#xff0c;UDP协议不需要进行稳定的连接即可直接对数据进行收发&#xff0c;即面向非连接的。所以UDP的应用场景在音视频流传输、在线游戏以及网络聊天室等实时传输需求大的背景。因为不需要建立连接&#xff0c;UDP的网络编程模型就比TCP简单许多。 接收端…

Qt - ui界面点击加载一段时间后闪退

Qt - ui界面点击加载一段时间后闪退 解决方案&#xff1a; 该路径下删除 widgetbox6.8.xml 文件即可&#xff0c;然后重新打开 QT 就可以成功打开 UI 界面了

【2024最新】基于springboot+vue的交流互动系统lw+ppt

作者&#xff1a;计算机搬砖家 开发技术&#xff1a;SpringBoot、php、Python、小程序、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;Java精选实战项…

Spring Boot框架下的足球青训俱乐部管理

2 相关技术简介 2.1 Java技术 Java是一门伟大的纯面向对象的编程语言和编程语言。同时&#xff0c;它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译&#xff0c;任何地方执行的优点&#xff0c;使得盛行的web应用程序有大量的Java编译&#xff0c;很好地支…

【AIGC】ChatGPT提示词Prompt高效编写模式:结构化Prompt、提示词生成器与单样本/少样本提示

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;结构化Prompt (Structured Prompt)组成元素应用实例优势结论 &#x1f4af;提示词生成器 (Prompt Creator)如何工作应用实例优势结论 &#x1f4af;单样本/少样本提示 (O…

LeetCode讲解篇之746. 使用最小花费爬楼梯

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 爬到第i层的最小花费 min(爬到第i - 1层的最小花费 从第i - 1层向上爬的花费, 爬到第i - 2层的最小花费 从第i - 2层向上爬的花费) 设f[i]为爬到第i层的最小花费 则f[i] min(f[i - 1] cost[i - 1], f[i -…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…

IDEA:增加类注释模板和方法注释模板

文章目录 概要配置类注释模板配置方法模版 概要 配置类注释和方法注释 配置类注释模板 点击setting->Editor->File and Code Templates&#xff0c;然后找到Class&#xff0c;如下图&#xff1a; 注意勾掉Reformat according to style&#xff0c;否则会格式化。 注…

Revisiting Graph-Based Fraud Detection in Sight of Heterophily and Spectrum

AAAI24 推荐指数&#xff1a; #paper/⭐ 领域&#xff1a;异常检测 摘要 这篇文章是关于一种新型的基于图神经网络&#xff08;GNN&#xff09;的欺诈检测方法&#xff0c;称为SEC-GFD&#xff08;Spectrum-Enhanced and Environment-Constrainted Graph Fraud Detector&…

黑马JavaWeb开发跟学(十二)SpringBootWeb案例

黑马JavaWeb开发跟学十二.SpringBootWeb案例 案例-登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令…

第100+27步 ChatGPT学习:概率校准 Temperature Scaling

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

基于PHP猫咖私人影院系统【附源码】

效果如下&#xff1a; 系统首页界面 用户注册界面 包厢信息界面 零食信息界面 管理员登录界面 包厢预订界面 猫咪信息界面 研究背景 近年来&#xff0c;随着生活品质的提升和个性化消费需求的增长&#xff0c;猫咖和私人影院等新兴休闲娱乐方式逐渐受到年轻人的青睐。猫咖结合…

Github 2024-10-08 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-10-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次关注人数…

毕设 深度学习图像搜索算法-图像搜索引擎(源码分享)

文章目录 0 简介1 前言2 图像检索介绍(1) 无监督图像检索(2) 有监督图像检索 3 图像检索步骤4 应用实例最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 深度学习图像搜索算法-图像搜索引擎(源码分享) 项目运行效果&#xff1a; 毕业设计 深度学习图像搜索算法-图…