(八)自然语言处理笔记——基于Neo4j的医疗问答系统

((八)自然语言处理笔记------基于Neo4j的医疗问答系统

使用py2neo链接Neo4j数据库

python 复制代码
pip install py2neo --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple

测试能否正常连接:

python 复制代码
from py2neo import Graph

graph = Graph(
    "bolt://192.168.8.216:7687",
    auth=("neo4j", "googosoft")
)

result = graph.run("CALL dbms.components() YIELD name, versions RETURN name, versions").data()
print(result)



reset_cypher = """
MATCH (n)
DETACH DELETE n
"""


graph.run(reset_cypher)

print("数据库已清空!")

创建节点与关系用法

python 复制代码
from py2neo import Node, Graph, Relationship,NodeMatcher


class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """建立连接"""
        link = Graph(
            "bolt://192.168.8.216:7687",
            auth=("neo4j", "googosoft")
        )
    
        self.graph = link
        #self.graph = NodeMatcher(link)
        # 定义label
        self.buy = 'buy'
        self.sell = 'sell'
        self.graph.delete_all()    # 清空数据库中所有数据
        self.matcher = NodeMatcher(link)
        
        """
        node3 = Node('animal' , name = 'cat')
        node4 = Node('animal' , name = 'dog')  
        node2 = Node('Person' , name = 'Alice')
        node1 = Node('Person' , name = 'Bob')  
        r1 = Relationship(node2 , 'know' , node1)    
        r2 = Relationship(node1 , 'know' , node3) 
        r3 = Relationship(node2 , 'has' , node3) 
        r4 = Relationship(node4 , 'has' , node2)    
        self.graph.create(node1)
        self.graph.create(node2)
        self.graph.create(node3)
        self.graph.create(node4)
        self.graph.create(r1)
        self.graph.create(r2)
        self.graph.create(r3)
        self.graph.create(r4)
        """

详细用法类:

python 复制代码
# -*- coding: utf-8 -*-
from py2neo import Node, Graph, Relationship,NodeMatcher


class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """建立连接"""
        link = Graph(
            "bolt://192.168.8.216:7687",
            auth=("neo4j", "googosoft")
        )
    
        self.graph = link
        #self.graph = NodeMatcher(link)
        # 定义label
        self.buy = 'buy'
        self.sell = 'sell'
        self.graph.delete_all()    # 清空数据库中所有数据
        self.matcher = NodeMatcher(link)
        
        """
        node3 = Node('animal' , name = 'cat')
        node4 = Node('animal' , name = 'dog')  
        node2 = Node('Person' , name = 'Alice')
        node1 = Node('Person' , name = 'Bob')  
        r1 = Relationship(node2 , 'know' , node1)    
        r2 = Relationship(node1 , 'know' , node3) 
        r3 = Relationship(node2 , 'has' , node3) 
        r4 = Relationship(node4 , 'has' , node2)    
        self.graph.create(node1)
        self.graph.create(node2)
        self.graph.create(node3)
        self.graph.create(node4)
        self.graph.create(r1)
        self.graph.create(r2)
        self.graph.create(r3)
        self.graph.create(r4)
        """


    def create_node(self, node_buy_key,node_sell_key):
        """建立节点"""
        for name in node_buy_key:
            buy_node = Node(self.buy, name=name)
            self.graph.create(buy_node)
        for name in node_sell_key:
            sell_node = Node(self.sell, name=name)
            self.graph.create(sell_node)
            
        

    def create_relation(self, df_data):
        """建立联系"""      
        m = 0
        for m in range(0, len(df_data)):
            try:    
                print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))
                print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))
                rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
                                   df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())

                self.graph.create(rel)
            except AttributeError as e:
                print(e, m)
            

将数据写入到Neo4j数据库中Demo

数据格式:

python 复制代码
# -*- coding: utf-8 -*-
from py2neo import Node, Graph, Relationship,NodeMatcher


class DataToNeo4j(object):
    """将excel中数据存入neo4j"""

    def __init__(self):
        """建立连接"""
        link = Graph(
            "bolt://192.168.8.216:7687",
            auth=("neo4j", "googosoft")
        )
    
        self.graph = link
        #self.graph = NodeMatcher(link)
        # 定义label
        self.buy = 'buy'
        self.sell = 'sell'
        self.graph.delete_all()    # 清空数据库中所有数据
        self.matcher = NodeMatcher(link)
        
        """
        node3 = Node('animal' , name = 'cat')
        node4 = Node('animal' , name = 'dog')  
        node2 = Node('Person' , name = 'Alice')
        node1 = Node('Person' , name = 'Bob')  
        r1 = Relationship(node2 , 'know' , node1)    
        r2 = Relationship(node1 , 'know' , node3) 
        r3 = Relationship(node2 , 'has' , node3) 
        r4 = Relationship(node4 , 'has' , node2)    
        self.graph.create(node1)
        self.graph.create(node2)
        self.graph.create(node3)
        self.graph.create(node4)
        self.graph.create(r1)
        self.graph.create(r2)
        self.graph.create(r3)
        self.graph.create(r4)
        """


    def create_node(self, node_buy_key,node_sell_key):
        """建立节点"""
        for name in node_buy_key:
            buy_node = Node(self.buy, name=name)
            self.graph.create(buy_node)
        for name in node_sell_key:
            sell_node = Node(self.sell, name=name)
            self.graph.create(sell_node)
            
        

    def create_relation(self, df_data):
        """建立联系"""      
        m = 0
        for m in range(0, len(df_data)):
            try:    
                print(list(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'")))
                print(list(self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'")))
                rel = Relationship(self.matcher.match(self.buy).where("_.name=" + "'" + df_data['buy'][m] + "'").first(),
                                   df_data['money'][m], self.matcher.match(self.sell).where("_.name=" + "'" + df_data['sell'][m] + "'").first())

                self.graph.create(rel)
            except AttributeError as e:
                print(e, m)
            

"""
Relationship(start_node, rel_type, end_node) 用法:
start_node:关系起点节点对象
rel_type:关系类型(通常是字符串,比如 'SELL_TO')
end_node:关系终点节点对象
"""
python 复制代码
# -*- coding: utf-8 -*-
from dataToNeo4jClass.DataToNeo4jClass import DataToNeo4j
import os
import pandas as pd
#pip install py2neo==5.0b1 注意版本,要不对应不了

invoice_data = pd.read_excel('/home/data/project/customer_AAA/NLP/Heima/018_Neo4j_pandasDemo/Invoice_data_Demo.xls', header=0)
#print(invoice_data)

#可以先阅读下文档:https://py2neo.org/v4/index.html

def data_extraction():
    """节点数据抽取"""

    # 取出购买方名称到list
    node_buy_key = []
    for i in range(0, len(invoice_data)):
        node_buy_key.append(invoice_data['购买方名称'][i])
    
    node_sell_key = []
    for i in range(0, len(invoice_data)):
        node_sell_key.append(invoice_data['销售方名称'][i])
        
    # 去除重复的发票名称
    node_buy_key = list(set(node_buy_key))
    node_sell_key = list(set(node_sell_key))

    # value抽出作node
    node_list_value = []
    for i in range(0, len(invoice_data)):
        for n in range(1, len(invoice_data.columns)):
            # 取出表头名称invoice_data.columns[i]
            node_list_value.append(invoice_data[invoice_data.columns[n]][i])
    # 去重
    node_list_value = list(set(node_list_value))
    # 将list中浮点及整数类型全部转成string类型
    node_list_value = [str(i) for i in node_list_value]

    return node_buy_key, node_sell_key,node_list_value


def relation_extraction():
    """联系数据抽取"""

    links_dict = {}
    sell_list = []
    money_list = []
    buy_list = []

    for i in range(0, len(invoice_data)):

        money_list.append(invoice_data['金额'][i])       #金额
        sell_list.append(invoice_data['销售方名称'][i])  #销售方方名称
        buy_list.append(invoice_data['购买方名称'][i])   #购买方名称 



    # 将数据中int类型全部转成string
    sell_list = [str(i) for i in sell_list]
    buy_list = [str(i) for i in buy_list]
    money_list = [str(i) for i in money_list]

    # 整合数据,将三个list整合成一个dict
    links_dict['buy'] = buy_list
    links_dict['money'] = money_list
    links_dict['sell'] = sell_list
    # 将数据转成DataFrame
    df_data = pd.DataFrame(links_dict)
    print(df_data)
    return df_data

relation_extraction()   # 提取关系
create_data = DataToNeo4j()   # 初始化Neo4j数据库

create_data.create_node(data_extraction()[0], data_extraction()[1])   # 图数据库创建节点的语句
create_data.create_relation(relation_extraction())                    # 图数据库创建关系的语句

写入后。结果如下:

代码下载:

python 复制代码
https://download.csdn.net/download/guoqingru0311/92443705
相关推荐
醒醒该学习了!7 小时前
大语言模型(理论篇)
人工智能·语言模型·自然语言处理
星贝爱科生物科研小能手10 小时前
CS-PLGA@褪黑素纳米粒(CS-PLGA@MT NPs)的应用场景有哪些?
人工智能·自然语言处理·机器翻译
羊羊小栈10 小时前
基于知识图谱(Neo4j)和大语言模型(LLM)的图检索增强(GraphRAG)的数控车床主轴系统故障诊断智能问答系统
人工智能·语言模型·毕业设计·知识图谱·创业创新·neo4j·大作业
极光代码工作室10 小时前
基于NLP的论文关键词提取系统
python·深度学习·自然语言处理·nlp
财经资讯数据_灵砚智能11 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月8日
大数据·人工智能·python·ai·信息可视化·自然语言处理·灵砚智能
高洁0112 小时前
用知识图谱重构搜索引擎
人工智能·python·数据挖掘·virtualenv·知识图谱
叫我:松哥12 小时前
基于deepseek大语言模型的项目架构图设计与绘制系统
人工智能·语言模型·自然语言处理·架构·flask·bootstrap
人工智能培训12 小时前
用知识图谱重构搜索引擎
大数据·人工智能·3d·重构·知识图谱·agent
Aipollo13 小时前
【知识图谱】语义本体的演进之路:从严谨到敏捷的范式转变
人工智能·知识图谱
财经资讯数据_灵砚智能13 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年6月9日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能