文章结尾部分有CSDN官方提供的学长 联系方式名片
文章结尾部分有CSDN官方提供的学长 联系方式名片
关注B站,有好处! 关注B站,私信获取! 麦麦大数据
本系统是一个使用vue+flask+neo4j+mysql实现的知识图谱问答系统,前端使用了vue2+vuetify框架来实现知识图谱可视化、飞机知识库、飞机知识问答;此外还包含了登录注册、个人信息修改的功能,系统的后端使用flask架构,将飞机知识图谱存储neo4j中,mysql主要存储系统用户信息。系统包含如下几个部分:第一个部分是数据导入部分,包含了excel数据导入neo4j的内容,先通过pandas读取excel内容,通过py2neo构建节点信息,然后再构建图谱的关系信息。
视频
F056飞机知识图谱问答系统演示
架构图

功能模块图

1 概述
- 整体系统采用前后端分离架构,前端为Vue工程,后端为Flask工程由python编写;
2 图谱的构建
- 数据通过 Excel 导入到 Neo4j 中。系统首先通过 pandas 读取 Excel 数据,并通过 py2neo 构建节点和关系。
- 然后,通过图数据库的关系建模,将图谱数据导入到 Neo4j 中,供后续的问答和查询使用。


3 图谱可视化
1. 前端(D3.js 可视化 + 交互功能)
前端部分主要使用 D3.js 进行图谱的渲染和交互,包括放大、缩小、节点点击等操作。还可以根据不同类型(飞机型号、生产商、事故航班等)进行筛选和模糊查询。




图谱渲染与交互设计
- 加载数据: 当用户查询问题时,前端通过 Axios 请求后端 API,后端查询 Neo4j 图数据库并返回图谱数据(节点和关系)。这些数据将被用来绘制图谱。
- 图谱绘制: 使用 D3.js 进行图谱的绘制。每个节点代表一个实体(如飞机型号、生产商、事故航班等),节点之间的关系通过连线表示。
- 模糊查询: 用户可以输入关键词进行模糊查询,D3.js 会动态更新图谱,突出显示与关键词相关的节点和关系。
- 放大与缩小: 使用 D3.js 提供的缩放功能 (
d3.zoom()) 实现图谱的放大、缩小和拖动功能。 - 节点交互: 用户点击某个节点时,D3.js 会触发相应的交互效果。例如,点击飞机型号时,右侧会展示该飞机的详细信息(如照片、属性等)。
交互效果与菜单展示
- 点击节点: 用户点击节点时,前端会发送 API 请求(例如,通过 Axios)向后端请求该节点的详细属性(如机型、生产商、事故信息等)。后端根据节点信息查询 Neo4j,返回相应的属性数据。
- 展示右侧菜单: 根据用户点击的节点类型,前端更新右侧的菜单信息,展示节点的属性。比如:
- 飞机型号: 显示飞机的照片、长度、翼展、巡航速度、升限等属性。
- 生产商: 显示生产商的名称、国家、成立时间、生产的飞机型号等信息。
- 事故航班: 显示航班的基本信息、日期、事故原因等。前端的菜单可以通过 DOM 更新(例如使用 React/Vue 等框架)来动态渲染这些信息。
4 问答功能




整体流程:
-
用户输入问题
- 用户通过前端界面输入自然语言问题。例如,"某型号飞机的xxx属性?"。
- 前端捕获用户输入并通过 Axios 发送请求到后端。
-
前端通过 Axios 发送请求
- Axios 发起 HTTP 请求(如 POST)到后端 Flask API,传递用户输入的问题。
- 请求携带的参数通常包括问题的文本。
-
后端接收请求并进行 Aho-Corasick 算法预处理
- 后端 Flask 路由接收到用户的问题后,开始进行预处理,核心是通过 Aho-Corasick 算法 提取关键词。
- Aho-Corasick 算法的作用是通过多模式字符串匹配技术,从用户的问题中识别出预定义的特征词(例如,飞机型号、飞机属性、飞机类型、生产商等关键词)。
Aho-Corasick 推理过程的详细步骤:
步骤 1:特征词加载与模型初始化
- 系统在初始化时加载一组预定义的特征词,这些特征词包括常见的飞机相关实体(如"飞机类型"、"生产商"、"飞机型号"等),以及问题类型的标签(如"长度"、"事故"、"生产"等)。
- 这些特征词被组织成一个多模式匹配树(AC自动机),用于高效匹配用户输入中的关键词。
步骤 2:问题类型分类与特征词匹配
- 在用户输入问题后,后端首先用 Aho-Corasick 算法匹配用户输入中的所有特征词。例如,如果用户输入"某型号飞机的发动机性能如何?",系统会检测到特征词"飞机型号"和"长度"。
- 根据匹配到的特征词,系统进一步判断问题的类型。问题的类型分类可以通过一些预定义的规则进行,比如:
- 如果问题包含"长度"关键词,则推测为关于长度的属性查询;
- 如果问题包含"翼展"关键词,则推测为与翼展相关的属性查询;
- 如果问题包含"生产"等关键词,则推测为询问飞机生产商对应生产机型的关系查询。
- 分类结果和特征词将作为下一步构建图谱查询的依据。
步骤 3:构建图谱查询语句
-
后端执行图谱查询并获取数据
- 后端使用 py2neo 库与 Neo4j 图数据库交互,执行生成的 Cypher 查询。
- Neo4j 图数据库根据查询返回匹配的节点和关系数据(例如,飞机的某些参数、飞机发生的事故等)。
-
处理查询结果并封装答案
- 返回的图数据通常是一个包含节点属性的集合。后端会对返回的数据进行进一步处理,整理成用户易于理解的回答。
- 例如,返回的性能数据可能是多个字段(如波音公司生产了多个飞机机型等),系统会根据问题的上下文对这些数据进行整合和美化。
- 如果查询涉及多个节点和关系,系统可能需要对结果进行排序、筛选和过滤,以确保返回的信息符合用户的意图。
- 此外,后端还可以根据返回的数据做一些额外的推理或补充,如推荐相关信息、给出解释或展示图片等。
- 返回的图数据通常是一个包含节点属性的集合。后端会对返回的数据进行进一步处理,整理成用户易于理解的回答。
-
前端展示查询结果
- 后端将最终的回答结果返回给前端,通常是 JSON 格式的数据,包含查询结果、文本答案等信息。
- 前端接收到数据后,将其格式化为用户友好的形式并展示在页面上。例如,展示问题的详细答案,或者在图谱中高亮相关节点和关系。
Aho-Corasick 算法的详细步骤
1. 特征词加载和模型初始化
- 加载一个包含所有飞机领域关键词的字典,如"飞机型号","生产商","事故","飞机类型"等。
- 使用 Aho-Corasick 算法构建一个自动机(trie树结构),每个节点表示一个字符。然后通过构建失配指针(fail pointer)和输出指针来加速匹配过程。
2. 问题匹配
- 对用户输入的文本,算法通过在树结构中快速匹配输入的字符串,找出所有可能的关键词。
- 对于每个匹配到的特征词,系统可以记录下其在问题中的位置,并根据这些匹配到的特征词进行问题分类。
3. 问题分类
- 根据匹配到的特征词,判断问题的类型。例如,如果匹配到"长度"类的特征词,问题就被分类为长度相关问题;如果匹配到"生产"相关的词汇,则分类为生产商和机型查询。
- 问题类型的分类有助于后续构建更加精准的图谱查询语句。
4. 生成图谱查询
- 通过分析问题中的关键词和问题类型,构建 Cypher 查询语言语句。系统根据问题的意图动态调整查询内容(例如,查询性能相关的属性,还是查询部件和系统的关系)。
- 对于涉及多个实体和关系的复杂问题,系统生成多级查询,结合图数据库的强大查询能力。
5. 封装和美化结果
- 返回的数据通常是图数据库节点和关系的属性,系统根据用户问题进行格式化。例如,将性能参数整理成一段清晰的文本描述,或通过图形化展示推力、油耗等数据。
- 系统还可以根据上下文做出解释和补充,增强用户体验。
5 飞机知识库查询
为了提供便捷的飞机信息查询服务,系统设计了一个直观、易用的飞机机型查询功能 。通过这个功能,用户可以快速查找到系统内所有飞机机型的详细信息。每个飞机机型都以卡片形式 展示,卡片设计简洁、美观,同时提供丰富的飞机属性信息,帮助用户更好地了解每种机型的特性。

1. 飞机卡片展示
每种飞机机型的信息都以一个卡片的形式展示,卡片设计突出视觉美感,同时确保信息清晰易读。具体展示内容如下:
- 示例图片:卡片上方展示的是飞机的高清示例图片,帮助用户直观地了解飞机的外观。图片清晰、精美,增强了页面的可视化效果。
- 飞机型号:卡片的下方会显示飞机的具体型号,方便用户快速识别。
- 飞机类型:标明飞机的类型,如"窄体"或"宽体",让用户了解该飞机的座舱布局和用途。
- 其他关键属性 :除了型号和类型,卡片还展示了飞机的一些核心属性,如:
- 飞机长度:标明飞机的总长度。
- 翼展:显示飞机的翼展,便于用户了解飞机的飞行性能。
- 生产商:显示飞机的生产商信息,如波音、空客等。
此外,每个卡片下方还提供了一个"查看详细属性"按钮,用户点击该按钮后可以查看该飞机的所有详细属性信息,包括但不限于飞行性能、机内配置等。
2. 分页展示
为了保持页面简洁和提高加载速度,每页显示4个飞机卡片。通过分页功能,用户可以方便地浏览更多的飞机机型。页面底部提供分页按钮,用户可以点击"上一页"或"下一页"来切换不同的飞机列表页面,快速浏览系统内的所有飞机机型。
3. 搜索功能
在页面的上方,提供了一个搜索输入框,用户可以在其中输入关键词进行模糊搜索。通过输入飞机型号、生产商、飞机类型等相关关键词,系统将自动筛选出匹配的飞机机型。搜索功能帮助用户迅速定位到自己感兴趣的飞机信息,提升了查询效率。
4. 用户体验与交互设计
- 视觉美感:每个飞机卡片都经过精心设计,确保信息清晰、布局合理,同时视觉效果美观、现代。飞机的图片展示和文字信息之间的配合使得整个页面既有功能性,又具有视觉吸引力。
- 分页与导航:分页功能清晰易用,用户可以方便地浏览飞机机型信息,不会因为信息过多而感到困惑。分页按钮的位置设计合理,操作简单直观。
- 搜索功能:搜索框支持模糊匹配,用户可以根据自己的需求输入关键字,系统会自动过滤出相关的飞机信息,极大提升了查询的效率。
6 个人信息修改
- 修改头像:可以上传自己想要的头像进行个性化设置
- 修改信息:修改个人信息如姓名、身份证号、年龄等
- 修改密码:若用户先更要修改密码,用户可以通过手机号码重置密码。

7 登录与注册
系统提供了一个简洁而安全的登录与注册功能,旨在为用户提供顺畅的操作体验。在同一个页面内,通过切换卡片的方式,用户可以选择进行登录或注册操作。以下是对系统登录与注册功能的详细描述:
1. 登录功能
登录功能是用户进入系统的第一步,用户需提供有效的用户名和密码。系统会验证输入的凭据,确保用户身份的正确性。具体流程如下:
- 界面设计:登录功能在一个卡片中实现,卡片内包含两个输入框:一个用于输入用户名,另一个用于输入密码。用户点击"登录"按钮后,系统会将输入的数据提交给后端进行验证。
- 后端验证:系统会向后端发送用户名和密码信息。后端会查询数据库,检查用户名是否存在,并核对密码是否正确。如果用户名或密码错误,系统会返回相应的错误提示信息,如"用户名或密码错误,请重新输入"。
- 登录成功 :若用户名和密码验证成功,用户将被自动重定向到系统主页,进入系统的主界面。

2. 注册功能
注册功能允许新用户创建账户。通过输入用户名、昵称和密码,用户可以完成注册流程。系统会检查用户名是否已被其他用户注册,以确保每个用户名的唯一性。具体流程如下:
- 界面设计:与登录页面类似,注册功能也在同一张卡片内实现,用户可以通过切换标签从登录切换到注册界面。注册页面包含三个输入框:用户名、昵称和密码,用户填写完这些信息后,点击"注册"按钮提交。
- 后端验证:在用户提交注册信息后,系统会向后端发送请求,后端会检查用户名是否已经存在于数据库中。如果用户名已存在,系统将返回提示信息,告知用户该用户名已被注册,无法继续注册。如果用户名未被占用,系统会将新用户的信息存入数据库,完成注册。
- 注册成功:注册成功后,系统会返回"注册成功"的提示,并允许用户直接跳转到登录页面,用户可以用刚刚注册的用户名和密码登录系统。
- 错误处理 :如果用户输入的密码不符合强度要求,系统会提示用户密码过于简单,需要更复杂的密码。所有字段都将进行必要的验证,确保信息的完整性和安全性。

3. 切换功能
登录和注册功能在同一个页面内通过切换卡片的方式实现。用户可以根据自己的需求,方便地在登录和注册界面之间切换。切换操作简洁直观,系统提供了清晰的视觉反馈,用户在卡片之间切换时,界面会平滑过渡。
4. 动图效果
为了提升用户体验,登录与注册页面上都将展示一张与系统主题相关的动图。动图不仅增加了页面的互动感,还能帮助用户更好地理解系统的特色和主题。动图将在页面加载时显示,并且在用户切换界面时始终保持一致,形成统一的视觉效果。
8 技术说明
8.1 前端部分
前端部分基于 Vue2 和 Vuetify 开发,同时使用 D3.js 实现知识图谱的可视化展示。具体的技术栈和实现如下:
- Vue2:Vue.js 是一个渐进式的 JavaScript 框架,用于构建用户界面。在这个系统中,Vue2 用于组织前端的组件,提供响应式的数据绑定和组件化开发,确保前端界面的可维护性和扩展性。
- Vuetify:Vuetify 是一个基于 Material Design 的 Vue.js UI 框架,它提供了大量的现成组件,可以帮助我们快速构建现代化的、响应式的用户界面。在这个系统中,Vuetify 用于构建登录、注册、个人信息管理、图谱可视化等各种 UI 组件。
- D3.js:D3.js 是一个强大的 JavaScript 数据可视化库,用于创建复杂的动态和交互式图表。在本系统中,D3.js 用于展示飞机知识图谱的可视化。通过 D3.js,我们可以将 Neo4j 中的数据节点和关系转换成图形化的元素,并为用户提供交互式的图谱浏览体验。例如,用户可以点击图谱中的节点查看详细信息,放大缩小图谱,拖拽图谱中的元素等。
- Axios:Axios 是一个基于 Promise 的 HTTP 库,用于前端与后端之间的数据交互。通过 Axios,前端可以发送异步请求(如 GET、POST 等)到后端的 RESTful API,获取或提交数据。Axios 在系统中用于实现前端与后端之间的通信,传输用户查询的问答请求、用户注册与登录信息等。
8.2 后端部分
后端使用 Flask 框架开发,提供 RESTful API 来支持前端的交互,并处理与数据库和知识图谱相关的各种操作。详细实现如下:
- Flask:Flask 是一个轻量级的 Python Web 框架,适合构建简单且灵活的 Web 应用。Flask 为后端提供了路由、请求处理、会话管理、模板渲染等基本功能。在这个系统中,Flask 用于构建 RESTful API,接收前端的 HTTP 请求并返回响应。
- SQLAlchemy:SQLAlchemy 是一个 Python 的 ORM(对象关系映射)库,用于简化对关系型数据库(如 MySQL)的操作。在系统中,SQLAlchemy 用于与 MySQL 数据库进行交互,存储和查询用户信息以及与飞机知识相关的静态数据(如飞机型号、飞机类型、长度、尾翼、油箱容量等参数等)。它通过 SQLAlchemy 的模型定义,使得数据库操作更加简洁、易于维护。
- Aho-Corasick 算法:Aho-Corasick 是一种高效的字符串匹配算法,常用于多模式匹配。在本系统中,Aho-Corasick 算法用于处理用户的自然语言查询,通过高效的模式匹配技术,快速找出用户查询中的关键词,并结合图谱数据进行回答。特别适用于快速回答多种模式的查询请求。
- py2neo :py2neo 是一个 Python 客户端库,用于与 Neo4j 图数据库进行交互。在系统中,py2neo 用于将用户查询映射到 Neo4j 图数据库的查询操作,提取与查询相关的图谱数据,并返回给前端。在问答环节,用户查询的问题会被转化为图谱查询,系统通过 py2neo 发起查询请求,利用图谱关系推理出答案。
- Neo4j :Neo4j 是一个图数据库,专门设计用于处理图形数据。图数据库使用节点(Node)和关系(Relationship)来表示和存储数据之间的关联。系统将飞机领域的知识存储在 Neo4j 中,包含了飞机型号、部件、系统、性能参数等节点,以及这些节点之间的关系(例如,飞机型号与发动机的关联)。Neo4j 提供了强大的图查询语言 Cypher,用于高效地查询节点间的复杂关系。后端通过 py2neo 库与 Neo4j 进行数据交互。
8.3 数据库部分
系统使用了两种数据库:MySQL 和 Neo4j。
- MySQL:MySQL 是一个关系型数据库,广泛用于存储结构化数据。在系统中,MySQL 用于存储与用户相关的信息(如用户名、密码、个人资料等)以及飞机知识库中一些静态的信息,如飞机型号、技术规格、历史数据等。这些信息通常以表格形式存储,方便进行 CRUD 操作。SQLAlchemy 用于简化对 MySQL 的操作,使得开发者能够通过 Python 对数据库进行操作。
- Neo4j:Neo4j 是一个图数据库,主要用于存储飞机相关的知识图谱。知识图谱中的实体(如飞机型号、发动机、部件等)被建模为节点,实体之间的关系(如"使用""属于"等)则被建模为边。Neo4j 适合存储复杂的关系数据,并且支持高效的图查询。在系统中,Neo4j 用于存储和管理飞机领域的知识,并支持基于图的推理和查询。
文章结尾部分有CSDN官方提供的学长 联系方式名片
文章结尾部分有CSDN官方提供的学长 联系方式名片
关注B站,有好处! 关注B站,私信获取! 麦麦大数据