基于Python和Neo4j搭建知识图谱医药问答系统

本博客介绍用Pycharm编写Python程序操作Neo4j搭建医药知识图谱和实现自动问答系统的实战练习。包括启动Neo4j、安装py2neo库、Python连接Neo4j,详细阐述了在Pycharm中搭建知识图谱和实现问答系统的步骤及代码,最终构建起含特定规模实体和关系的知识图谱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、启动Neo4j

二、安装py2neo库

三、Python连接Neo4j

四、Pycharm中搭建医药知识图谱

1、读取文件

2、建立节点

3、创建知识图谱中心疾病的节点

4、创建知识图谱实体节点类型

5、创建实体关系边

6、创建实体关联边

7、导出数据

8、运行程序

9、运行结果

五、Pycharm中实现自动问答系统

1、模型初始化

2、问答主函数

3、运行程序

4、运行结果

六、其他(问答子函数)

1、问句类型分类脚本

2、问句解析脚本  

3、问答程序脚本  

总结


前言

本案例用Pycharm编写Python程序操作Neo4j搭建知识图谱医药问答系统实战练习
本案例借鉴刘焕勇老师个人项目


一、启动Neo4j

如何启动Neo4j,请参考此教程

运行项目前,先清空Neo4j数据库

MATCH (n) DETACH DELETE n


二、安装py2neo库

代码学习参考py2neo官网文档

pip install py2neo


三、Python连接Neo4j

 链接Neo4j的地址为:"bolt://localhost:7687"

 在本章中最开始的部分已经更改用户名默认为neo4j,密码在本章中最开始的部分已经更改

import json
import os

from py2neo import Graph, Node


class MedicalGraph:
    def __init__(self):
        cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
        self.data_path = os.path.join(cur_dir, 'data/medical.json')
        self.g = Graph("bolt://localhost:7687", auth=("neo4j", "tang2001"))

注意:build_medicalgraph.py 和 answer_search.py两个原文件中的self.g = Graph()的链接格式都更改为上述代码中的格式。

参考py2neo官网文档—Python连接Neo4j


四、Pycharm中搭建医药知识图谱

1、读取文件

代码如下:

    def read_nodes(self):
        # 共7类节点
        drugs = []  # 药品
        foods = []  # 食物
        checks = []  # 检查
        departments = []  # 科室
        producers = []  # 药品大类
        diseases = []  # 疾病
        symptoms = []  # 症状

        disease_infos = []  # 疾病信息

        # 构建节点实体关系
        rels_department = []  # 科室-科室关系
        rels_noteat = []  # 疾病-忌吃食物关系
        rels_doeat = []  # 疾病-宜吃食物关系
        rels_recommandeat = []  # 疾病-推荐吃食物关系
        rels_commonddrug = []  # 疾病-通用药品关系
        rels_recommanddrug = []  # 疾病-热门药品关系
        rels_check = []  # 疾病-检查关系
        rels_drug_producer = []  # 厂商-药物关系

        rels_symptom = []  # 疾病症状关系
        rels_acompany = []  # 疾病并发关系
        rels_category = []  # 疾病与科室之间的关系

        count = 0
        for data in open(self.data_path, encoding='utf8', mode='r'):
            disease_dict = {}
            count += 1
            print(count)
            data_json = json.loads(data)
            disease = data_json['name']
            disease_dict['name'] = disease
            diseases.append(disease)
            disease_dict['desc'] = ''
            disease_dict['prevent'] = ''
            disease_dict['cause'] = ''
            disease_dict['easy_get'] = ''
            disease_dict['cure_department'] = ''
            disease_dict['cure_way'] = ''
            disease_dict['cure_lasttime'] = ''
            disease_dict['symptom'] = ''
            disease_dict['cured_prob'] = ''

            if 'symptom' in data_json:
                symptoms += data_json['symptom']
                for symptom in data_json['symptom']:
                    rels_symptom.append([disease, symptom])

            if 'acompany' in data_json:
                for acompany in data_json['acompany']:
                    rels_acompany.append([disease, acompany])

            if 'desc' in data_json:
                disease_dict['desc'] = data_json['desc']

            if 'prevent' in data_json:
                disease_dict['prevent'] = data_json['prevent']

            if 'cause' in data_json:
                disease_dict['cause'] = data_json['cause']

            if 'get_prob' in data_json:
                disease_dict['get_prob'] = data_json['get_prob']

            if 'easy_get' in data_json:
                disease_dict['easy_get'] = data_json['easy_get']

            if 'cure_department' in data_json:
                cure_department = data_json['cure_department']
                if len(cure_department) == 1:
                    rels_category.append([disease, cure_department[0]])
                if len(cure_department) == 2:
                    big = cure_department[0]
                    small = cure_department[1]
                    rels_department.append([small, big])
                    rels_category.append([disease, small])

                disease_dict['cure_department'] = cure_department
                departments += cure_department

            if 'cure_way' in data_json:
                disease_dict['cure_way'] = data_json['cure_way']

            if 'cure_lasttime' in data_json:
                disease_dict['cure_lasttime'] = data_json['cure_lasttime']

            if 'cured_prob' in data_json:
                disease_dict['cured_prob'] = data_json['cured_prob']

            if 'common_drug' in data_json:
                common_drug = data_json['common_drug']
                for drug in common_drug:
                    rels_commonddrug.append([disease, drug])
                drugs += common_drug

            if 'recommand_drug' in data_json:
                recommand_drug = data_json['recommand_drug']
                drugs += recommand_drug
                for drug in recommand_drug:
                    rels_recommanddrug.append([disease, drug])

            if 'not_eat' in data_json:
                not_eat = data_json['not_eat']
                for _not in not_eat:
                    rels_noteat.append([disease, _not])

                foods += not_eat
                do_eat = data_json['do_eat']
                for _do in do_eat:
                    rels_doeat.append([disease, _do])

                foods += do_eat
                recommand_eat = data_json['recommand_eat']

                for _recommand in recommand_eat:
                    rels_recommandeat.append([disease, _recommand])
                foods += recommand_eat

            if 'check' in data_json:
                check = data_json['check']
                for _check in check:
                    rels_check.append([disease, _check])
                checks += check
            if 'drug_detail' in data_json:
                drug_detail = data_json['drug_detail']
                producer = [i.split('(')[0] for i in drug_detail]
                rels_drug_producer += [[i.split('(')[0], i.split('(')[-1].replace(')', '')] for i in drug_detail]
                producers += producer
            disease_infos.append(disease_dict)
        return set(drugs), set(foods), set(checks), set(departments), set(producers), set(symptoms), set(diseases), disease_infos, \
               rels_check, rels_recommandeat, rels_noteat, rels_doeat, rels_department, rels_commonddrug, rels_drug_producer, rels_recommanddrug, \
               rels_symptom, rels_acompany, rels_category

2、建立节点

 代码如下:

    def create_node(self, label, nodes):
        count = 0
        for node_name in nodes:
            node = Node(label, name=node_name)
            self.g.create(node)
            count += 1
            print(count, len(nodes))
        return

3、创建知识图谱中心疾病的节点

 代码如下:

    def create_diseases_nodes(self, disease_infos):
        count = 0
        for disease_dict in disease_infos:
            node = Node("Disease", name=disease_dict['name'], desc=disease_dict['desc'],
                        prevent=disease_dict['prevent'], cause=disease_dict['cause'],
                        easy_get=disease_dict['easy_get'], cure_lasttime=disease_dict['cure_lasttime'],
                        cure_department=disease_dict['cure_department']
                        , cure_way=disease_dict['cure_way'], cured_prob=disease_dict['cured_prob'])
            self.g.create(node)
            count += 1
            print(count)
        return

4、创建知识图谱实

### 使用 Neo4j 构建感冒中成药知识图谱 #### 准备工作环境 为了构建一个有效的知识图谱,首先需要准备合适的工作环境。安装并配置好 Neo4j 数据库是必不可少的第一步。对于本案例而言,Neo4j 的安装路径位于 `F:\neo4j\neo4j-chs-community-4.2.4-windows`[^1]。 确保已经正确设置了 Neo4j 用户名密码,并完成了必要的文件修改以便顺利访问数据库服务。这一步骤至关重要,因为后续所有的操作都将依赖于这个稳定运行的服务平台。 #### 导入数据到 Neo4j 中 接下来就是将收集好的感冒中成药相关数据导入至 Neo4j 数据库内。这里可以通过 Python 脚本来实现自动化处理过程: ```python import neo4j from neo4j import GraphDatabase def create_connection(): uri = "bolt://localhost:7687" user = "your_username" password = "your_password" driver = GraphDatabase.driver(uri, auth=(user, password)) return driver def load_data(driver): with driver.session() as session: # 假设有一个 CSV 文件包含了感冒中成药的信息 result = session.run( """ LOAD CSV WITH HEADERS FROM 'file:///cold_medicine.csv' AS row CREATE (m:ColdMedicine {name:row.name}) SET m += apoc.map.clean(row,['name'],[]) """) if __name__ == "__main__": driver = create_connection() try: load_data(driver) finally: driver.close() ``` 这段代码展示了如何利用 Py2neo 库来加载外部 CSV 文件中的感冒中成药信息进入 Neo4j 图形数据库。注意这里的 URI 地址、用户名以及密码都需要替换为自己实际使用的参数值。 #### 创建节点与边的关系模式 当所有数据都被成功载入之后,则可以开始设计具体的节点类型及其之间存在的逻辑联系形式。例如,在此场景下可以选择创建如下几种主要类型的节点:“症状”,“成分”,“适应症”等等;而对于这些不同类别间的关联方式则可能涉及到诸如 “治疗”,“包含” 或者其他更为专业的术语描述。 ```cypher // 定义一些基本的节点标签 CREATE CONSTRAINT ON (symptom:Symptom) ASSERT symptom.id IS UNIQUE; CREATE CONSTRAINT ON (ingredient:Ingredient) ASSERT ingredient.id IS UNIQUE; CREATE CONSTRAINT ON (indication:Indication) ASSERT indication.id IS UNIQUE; // 描述药物与其所含有的活性物质之间的关系 MATCH (med:ColdMedicine),(ingr:Ingredient) WHERE med.contains_ingredients CONTAINS ingr.name MERGE (med)-[:CONTAINS]->(ingr); // 表达某种特定病症适用于哪些种类的药品 MATCH (disease:Disease),(treat:Treatment) WHERE disease.treated_by CONTAINS treat.name MERGE (disease)<-[rel:TREATED_BY]-(treat); ``` 上述 Cypher 查询语句片段说明了怎样去定义各个实体对象间相互作用的方式——即所谓的“边”。通过这种方式不仅可以清晰直观地表达出复杂多变的实际业务情况,同时也便于后期进一步挖掘潜在价值所在之处。 #### 启动问答功能 最后要做的便是激活基于已建成的知识图谱之上的交互式查询界面。这一部分同样借助 Python 实现较为便捷高效的做法: ```bash $ python chat_graph.py ``` 执行以上命令即可开启聊天机器人程序,允许用户输入自然语言问题获得即时反馈解答。整个过程中涉及到了对先前录入的所有知识点进行全面检索匹配的过程,最终呈现出最贴合需求的结果给提问者查看参考使用[^4]。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑞雪兆我心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值