前言

本教程一共分为7个小教程专为零基础小白设计,从概念到实战,带你轻松入门!

📁 资源福利:教程代码+数据集+工具安装包,私信领取!

【解决毕设的最后一公里】基于知识图谱的智能问答系统教程实战一----项目整体介绍【Django+neo4j+大模型】

先看此视频:20分钟快速用django+mysql+pycharm搭建一个自己的web网站

修改Django管理员后端教程:手把手教你配置Django SimpleUI打造美丽后台

6.1 settings.py设置

  • 添加两个子用户:

请添加图片描述

  • 采用django框架自带的sqlite数据库

请添加图片描述

  • 前端配置

请添加图片描述

  • 大模型api配置

此处api_key到智谱开放平台自行获取,新用户赠送现时一个月500万tokens,地址:https://open.bigmodel.cn/,进行登录注册,然后进入个人中心创建API key

请添加图片描述

最后修改settings.py中的api借口

请添加图片描述

6.2 pyneo_utils.py neo4j知识图谱可视化详解

主要实现以下功能:

  1. 动态构建Cypher查询,根据输入参数(起始节点、关系类型、结束节点)查询图数据
  2. 格式化图数据,转换为前端可视化(如ECharts关系图)所需的JSON结构
  3. 节点分类染色,为不同节点类型(CLASS/TIME/LOC等)分配对应颜色

1. 颜色定义

color = {
    "CLASS": "#5470c6",
    "TIME": "#e474c6",
    "LOC": "#147fc6",
    "RES": "#947dc6",
    "EVE": "#847986",
    "EVC": "#8374c6",
    "other": "#111111"
}
  • 定义节点类型与颜色的映射关系
  • 未匹配类型默认使用other的黑色

2. 辅助函数 get_node_by_name

  • 功能:根据节点标签(如"Person")和名称精确查找节点
def get_node_by_name(g, node_type, name):
    matcher = NodeMatcher(g)
    endnode = matcher.match(node_type,  name=name).first()
    return endnode if endnode else None

3. 属性格式化 get_str_by_dict

  • 功能:将字典转换为HTML格式字符串(用于前端展示节点属性)例{"age": 20} → "age:20<br>"
def get_str_by_dict(mydict):
    last = ""
    for key in mydict:
        last = str(key) + ":" + str(mydict[key]) + "&lt;br&gt;" + last
    return last

4. 核心函数 get_all_relation

def get_all_relation(start, relation, end):
    # 初始化数据结构
    datas = []  # 节点数据
    links = []  # 关系数据
    cache = []  # 去重缓存
    categories = []  # 分类列表
    legend_data = []  # 图例数据
    
    # 连接数据库
    g = Graph('http://localhost:7474', user='neo4j', password='123456')

    # 动态构建Cypher查询
    sql = "MATCH (n)-[%s]-(b) %s RETURN n,r,b LIMIT 100"
    ...

关键逻辑解析

  1. 动态Cypher构建

    • 根据输入参数动态生成WHERE子句
    • 示例:start="Alice", relation="KNOWS" → MATCH (n)-[r:KNOWS]-(b) WHERE n.name='Alice' RETURN n,r,b
  2. 结果处理

    for nodes_relations in nodes_data_all:
        # 提取节点标签和属性
        start_label = str(nodes_relations['n'].labels).replace(":", "")
        end_label = str(nodes_relations['b'].labels).replace(":", "")
        ...
    
  3. 节点去重与染色

    if start_name not in cache:
        datas.append({
            "name": start_name,
            "attr": start,
            "color": color.get(start_label,  color["other"]),
            "des": get_str_by_dict(start),
            "category": start_label
        })
        cache.append(start_name)
    
    • 使用cache列表避免重复添加节点
    • 根据节点标签匹配颜色配置
  4. 关系处理

    links.append({
        "source": start_name,
        "target": end_name,
        "name": relation
    })
    
    • 记录关系的起点、终点和类型

输出数据结构示例

{
  "datas": [
    {
      "name": "NodeA",
      "color": "#5470c6",
      "des": "prop1:value1&lt;br&gt;prop2:value2",
      "category": "CLASS"
    }
  ],
  "links": [
    {"source": "NodeA", "target": "NodeB", "name": "REL_TYPE"}
  ],
  "legend_data": ["CLASS", "TIME"],
  "categories": [{"name": "CLASS"}, {"name": "TIME"}]
}

更多推荐