基于neo4j存储知识树-mac

news2025/4/18 3:33:28

1、安装jdk21 for mac(jdk-21_macos-aarch64_bin.dmg)

2、安装neo4j for mac(neo4j-community-5.26.0-unix.tar.gz)

3、使用默认neo4j/neo4j登录http://localhost:7474

修改登录密码,可以使用生成按钮生成密码,连接数据库,默认设置为neo4j://localhost:7687。

3、具体代码如下:

import networkx as nx
import json
import requests
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from py2neo import Graph, Node, Relationship

# 设置字体路径
font_path = "/System/Library/Fonts/STHeiti Light.ttc"  # macOS系统自带的黑体字体路径
font_prop = FontProperties(fname=font_path)

# 连接到Neo4j数据库
def connect_to_neo4j(uri, user, password):
    graph = Graph(uri, auth=(user, password))
    return graph

# 将知识树保存到Neo4j数据库
def save_knowledge_tree_to_neo4j(graph, tree):
    # 清空数据库
    graph.delete_all()
    # 添加节点和关系
    for node in tree.nodes():
        neo4j_node = Node("Concept", name=node)
        graph.create(neo4j_node)
    for u, v in tree.edges():
        u_node = graph.nodes.match("Concept", name=u).first()
        v_node = graph.nodes.match("Concept", name=v).first()
        if u_node and v_node:
            rel = Relationship(u_node, "ANSWERED_BY", v_node)
            graph.create(rel)

# 可视化知识树
def visualize_tree(tree):
    pos = nx.spring_layout(tree, k=0.5, iterations=20)  # 节点布局
    nx.draw(tree, pos, with_labels=True, node_size=500, node_color="skyblue", font_size=8, font_weight='bold', font_family=font_prop.get_name())
    plt.title("知识树", fontproperties=font_prop)
    plt.axis('off')  # 关闭坐标轴
    plt.show()

# 示例对话内容
dialogue = """
客户:你好,我想了解一下产品的保修政策。
坐席:您好!我们的产品保修期为一年,从购买之日起计算。
客户:如果产品在保修期内出现故障,我该怎么办?
坐席:您可以在保修期内将产品送到我们指定的维修点进行免费维修。
客户:维修点在哪里?
坐席:您可以在我们的官方网站上查询最近的维修点地址。
客户:好的,谢谢!
坐席:不客气,祝您生活愉快!
"""

# 手动解析对话内容
def parse_dialogue(dialogue):
    lines = dialogue.strip().split("\n")
    questions = []
    answers = []
    for i in range(0, len(lines), 2):
        question = lines[i].replace("客户:", "").strip()
        answer = lines[i + 1].replace("坐席:", "").strip()
        questions.append(question)
        answers.append(answer)
    return questions, answers

questions, answers = parse_dialogue(dialogue)
print("问题:", questions)
print("答案:", answers)

def build_knowledge_tree(questions, answers):
    tree = nx.DiGraph()
    root = "根据对话初始化的知识树"
    tree.add_node(root)
    
    for q, a in zip(questions, answers):
        tree.add_node(q)
        tree.add_edge(root, q)
        tree.add_node(a)
        tree.add_edge(q, a)
    return tree

knowledge_tree = build_knowledge_tree(questions, answers)

# 可视化知识树
visualize_tree(knowledge_tree)

# 生成需要补充的问题
def generate_supplement_questions(questions, answers):
    prompt = "基于以上对话内容,您认为还需要补充哪些问题?请以问题的形式列出。\n"
    for q, a in zip(questions, answers):
        prompt += f"问题:{q}\n答案:{a}\n"
    prompt += "需要补充的问题:"
    print('user:', prompt)
    # 调用 Ollama API 生成补充问题
    data = {
        "model": "qwen2.5:14b",
        "prompt": prompt,
        "stream": False,
        "temperature": 0.7,
        "max_tokens": 200
    }
    try:
        response = requests.post("http://127.0.0.1:11434/api/generate", json=data)
        if response.status_code == 200:
            return response.json().get("response", "")
        else:
            return f"API 请求失败,状态码:{response.status_code}"
    except Exception as e:
        return f"API 请求失败,错误信息:{e}"

# 生成需要补充的问题
supplement_questions = generate_supplement_questions(questions, answers)
print("assistant:需要补充的问题:", supplement_questions)

# 专家回答
def expert_answers(supplement_questions):
    print("专家,请回答以下问题:")
    print(supplement_questions)
    answers = []
    for q in supplement_questions.split("\n"):
        if q.strip():
            print(f"问题:{q}")
            answer = input("专家回答输入:")
            answers.append(answer)
    return answers

# 专家回答
expert_answers_list = expert_answers(supplement_questions)
print("专家的回答:", expert_answers_list)

# 构建知识树
def build_knowledge_tree(questions, answers, supplement_questions, expert_answers):
    tree = nx.DiGraph()
    root = "专家补充回答后的知识树"
    tree.add_node(root)
    
    for q, a in zip(questions, answers):
        tree.add_node(q)
        tree.add_edge(root, q)
        tree.add_node(a)
        tree.add_edge(q, a)
    
    for q, a in zip(supplement_questions.split("\n"), expert_answers):
        if q.strip():
            tree.add_node(q)
            tree.add_edge(root, q)
            tree.add_node(a)
            tree.add_edge(q, a)
    
    return tree

# 构建知识树
knowledge_tree = build_knowledge_tree(questions, answers, supplement_questions, expert_answers_list)

# 连接到Neo4j数据库
neo4j_uri = "neo4j://localhost:7687"
neo4j_user = "neo4j"
neo4j_password = "密码"  # 替换为你的Neo4j密码(生成或设置的密码)
graph = connect_to_neo4j(neo4j_uri, neo4j_user, neo4j_password)

# 将知识树保存到Neo4j数据库
save_knowledge_tree_to_neo4j(graph, knowledge_tree)

# 查询功能
def query_knowledge_tree(graph, question):
    query = """
    MATCH (q:Concept {name: $question})-[:ANSWERED_BY]->(a:Concept)
    RETURN a.name AS answer
    """
    result = graph.run(query, question=question)
    return [record["answer"] for record in result]

# 测试查询功能
for question in questions:
    result = query_knowledge_tree(graph, question)
    print("原始问题:", question)
    if result:
        print(f"查询结果:")
        for node in result:
            print(node)
    else:
        print("未找到相关问题的答案。")

for question in supplement_questions.split("\n"):
    result = query_knowledge_tree(graph, question)
    print("补充问题:", question)
    if result:
        print(f"查询结果:")
        for node in result:
            print(node)
    else:
        print("未找到相关问题的答案。")

4、显示效果:

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

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

相关文章

【学习笔记】文件上传漏洞--二次渲染、.htaccess、变异免杀

目录 第十二关 远程包含地址转换 第十三关 突破上传删除 条件竞争 第十四关 二次渲染 第十五关 第十六关 第十七关 .htaccess 第十八关 后门免杀 第十九关 日志包含 第十二关 远程包含地址转换 延续第十一关,加一个文件头,上传成功&#xff0c…

【OS】Process Management(3)

《计算机操作系统(第三版)》(汤小丹)学习笔记 文章目录 5、进程通信(Inter-Process Communication)5.1、进程通信的类型5.1.1、共享存储器系统(Shared Memory System)5.1.2、消息传递…

单reactor实战

前言:reactor作为一种高性能的范式,值得我们学习 本次目标 实现一个基于的reactor 具备echo功能的服务器 核心组件 Reactor本身是靠一个事件驱动的框架,无疑引出一个类似于moduo的"EventLoop "以及boost.asio中的context而言,不断…

初阶C++笔记第一篇:C++基础语法

虽然以下大多数知识点都在C语言中学过,但还是有一些知识点和C语言不同,比如:代码格式、头文件、关键字、输入输出、字符串类型等... 1. 初识C 1.1 第一个C程序 编写C分为4个步骤: 创建项目创建文件编写代码运行程序 C的第一条…

无需libpacp库,BPF指令高效捕获指定数据包

【环境】无libpacp库的Linux服务器 【要求】高效率读取数据包,并过滤指定端口和ip 目前遇到两个问题 一是手写BPF,难以兼容,有些无法正常过滤二是性能消耗问题,尽可能控制到1% 大方向:过滤数据包要在内核层处理&…

react实现上传图片到阿里云OSS以及问题解决(保姆级)

一、优势 提高上传速度:前端直传利用了浏览器与 OSS 之间的直接连接,能够充分利用用户的网络带宽。相比之下,后端传递文件时,文件需要经过后端服务器的中转,可能会受到后端服务器网络环境和处理能力的限制,…

Python 字典和集合(常见的映射方法)

本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 常见的映射方法 映射类型…

Matlab轴承故障信号仿真与故障分析

1.摘要 本文介绍了一个基于Matlab的轴承故障信号仿真与分析程序,旨在模拟和分析轴承内圈故障信号的特征。程序首先通过生成故障信号、共振信号和调制信号,添加噪声和离散化处理,构建模拟的振动信号,并保存相关数据。通过快速傅里…

Linux 进程 | 概念 / 特征 / 状态 / 优先级 / 空间

注: 本文为 “Linux 进程” 相关文章合辑。 未整理去重。 Linux 进程概念(精讲) A little strawberry 于 2021-10-15 10:23:55 发布 基本概念 课本概念:程序的一个执行实例,正在执行的程序等。 内核观点&#xff…

重回全面发展亲自操刀

项目场景: 今年工作变动,优化后在一家做国有项目的私人公司安顿下来了。公司环境不如以前,但是好在瑞欣依然可以每天方便的买到。人文氛围挺好,就是工时感觉有点紧,可能长期从事产品迭代开发,一下子转变做项…

3D珠宝渲染用什么软件比较好?渲染100邀请码1a12

印度珠宝商 Mohar Fine Jewels 和英国宝石商 Gemfields 在今年推出了合作珠宝系列——「Emeralds in Full Bloom」,它的灵感源自花草绽放的春季田野,共有 39 件作品,下面这个以植物为主题的开口手镯就是其中一件。 在数字时代,像这…

【数据结构】邻接矩阵完全指南:原理、实现与稠密图优化技巧​

邻接矩阵 导读一、图的存储结构1.1 分类 二、邻接矩阵法2.1 邻接矩阵2.2 邻接矩阵存储网 三、邻接矩阵的存储结构四、算法评价4.1 时间复杂度4.2 空间复杂度 五、邻接矩阵的特点5.1 特点1解析5.2 特点2解析5.3 特点3解析5.4 特点4解析5.5 特点5解析5.6 特点6解析 结语 导读 大…

【嵌入式-stm32电位器控制以及旋转编码器控制LED亮暗】

嵌入式-stm32电位器控制LED亮暗 任务1代码1Key.cKey.hTimer.cTimer.hPWM.cPWM.hmain.c 实验现象1任务2代码2Key.cKey.hmain.c 实验现象2问题与解决总结 源码框架取自江协科技,在此基础上做扩展开发。 任务1 本文主要介绍利用stm32f103C8T6实现电位器控制PWM的占空比…

Uniapp 集成极光推送(JPush)完整指南

文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一:使用UniPush(推荐)方法二:手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…

2025年常见渗透测试面试题-sql(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 SQLi 一、发现test.jsp?cid150 注入点的5种WebShell获取思路 1. 文件写入攻击 2. 日志文件劫持 3.…

【RabbitMQ】队列模型

1.概述 RabbitMQ作为消息队列,有6种队列模型,分别在不同的场景进行使用,分别是Hello World,Work queues,Publish/Subscribe,Routing,Topics,RPC。 下面就分别对几个模型进行讲述。…

StarRocks 助力首汽约车精细化运营

作者:任智红,首汽约车大数据负责人 更多交流,联系我们:https://wx.focussend.com/weComLink/mobileQrCodeLink/334%201%202/ffbe5 导读: 本文整理自首汽约车大数据负责人任智红在 StarRocks 年度峰会上的演讲&#xf…

痉挛性斜颈康复助力:饮食调养指南

痉挛性斜颈患者除了积极治疗,合理饮食也能辅助缓解症状,提升生活质量。其健康饮食可从以下方面着手: 高蛋白质食物助力肌肉修复 痉挛性斜颈会导致颈部肌肉异常收缩,消耗较多能量,蛋白质有助于肌肉的修复与维持。日常可…

mysql镜像创建docker容器,及其可能遇到的问题

前提,已经弄好基本的docker服务了。 一、基本流程 1、目录准备 我自己的资料喜欢放在 /data 目录下,所以老规矩: 先进入 /data 目录: cd /data 创建 mysql 目录并进入: mkdir mysql cd mysql 2、镜像查找 docke…

JavaEE——线程的状态

目录 前言1. NEW2. TERMINATED3. RUNNABLE4. 三种阻塞状态总结 前言 本篇文章来讲解线程的几种状态。在Java中,线程的状态是一个枚举类型,Thread.State。其中一共分为了六个状态。分别为:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING, TERMI…