不要留下遗憾 发表于 2022-4-15 16:09:41

python连接Neo4j失败导入错误ImportError: cannot import name \\\'SocketAddress\\\'

本帖最后由 不要留下遗憾 于 2022-4-16 10:30 编辑

用python连接数据库neo4j出现错误ImportError: cannot import name 'SocketAddress' from 'neo4j.addressing' (D:\anaconda\lib\site-packages\neo4j\addressing.py)
软件版本neo4j:4.2.15
python3.7
javase:15.0
代码如下:from py2neo import Graph, Node, Relationship
import pandas as pd
import re
import os


class MedicalGraph:
    def __init__(self):
      cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
      self.data_path = os.path.join(cur_dir, 'DATA/disease.csv')
      self.graph = Graph("http://localhost:7474", username="neo4j", password="")

    def read_file(self):
      """
      读取文件,获得实体,实体关系
      :return:
      """
      # cols = ["name", "alias", "part", "age", "infection", "insurance", "department", "checklist", "symptom",
      #         "complication", "treatment", "drug", "period", "rate", "money"]
      # 实体
      diseases = []# 疾病
      aliases = []# 别名
      symptoms = []# 症状
      parts = []# 部位
      departments = []# 科室
      complications = []# 并发症
      drugs = []# 药品

      # 疾病的属性:age, infection, insurance, checklist, treatment, period, rate, money
      diseases_infos = []
      # 关系
      disease_to_symptom = []# 疾病与症状关系
      disease_to_alias = []# 疾病与别名关系
      diseases_to_part = []# 疾病与部位关系
      disease_to_department = []# 疾病与科室关系
      disease_to_complication = []# 疾病与并发症关系
      disease_to_drug = []# 疾病与药品关系

      all_data = pd.read_csv(self.data_path, encoding='gb18030').loc[:, :].values
      for data in all_data:
            disease_dict = {}# 疾病信息
            # 疾病
            disease = str(data).replace("...", " ").strip()
            disease_dict["name"] = disease
            # 别名
            line = re.sub("[,、;,.;]", " ", str(data)) if str(data) else "未知"
            for alias in line.strip().split():
                aliases.append(alias)
                disease_to_alias.append()
            # 部位
            part_list = str(data).strip().split() if str(data) else "未知"
            for part in part_list:
                parts.append(part)
                diseases_to_part.append()
            # 年龄
            age = str(data).strip()
            disease_dict["age"] = age
            # 传染性
            infect = str(data).strip()
            disease_dict["infection"] = infect
            # 医保
            insurance = str(data).strip()
            disease_dict["insurance"] = insurance
            # 科室
            department_list = str(data).strip().split()
            for department in department_list:
                departments.append(department)
                disease_to_department.append()
            # 检查项
            check = str(data).strip()
            disease_dict["checklist"] = check
            # 症状
            symptom_list = str(data).replace("...", " ").strip().split()[:-1]
            for symptom in symptom_list:
                symptoms.append(symptom)
                disease_to_symptom.append()
            # 并发症
            complication_list = str(data).strip().split()[:-1] if str(data) else "未知"
            for complication in complication_list:
                complications.append(complication)
                disease_to_complication.append()
            # 治疗方法
            treat = str(data).strip()[:-4]
            disease_dict["treatment"] = treat
            # 药品
            drug_string = str(data).replace("...", " ").strip()
            for drug in drug_string.split()[:-1]:
                drugs.append(drug)
                disease_to_drug.append()
            # 治愈周期
            period = str(data).strip()
            disease_dict["period"] = period
            # 治愈率
            rate = str(data).strip()
            disease_dict["rate"] = rate
            # 费用
            money = str(data).strip() if str(data) else "未知"
            disease_dict["money"] = money

            diseases_infos.append(disease_dict)

      return set(diseases), set(symptoms), set(aliases), set(parts), set(departments), set(complications), \
                set(drugs), disease_to_alias, disease_to_symptom, diseases_to_part, disease_to_department, \
                disease_to_complication, disease_to_drug, diseases_infos

    def create_node(self, label, nodes):
      """
      创建节点
      :param label: 标签
      :param nodes: 节点
      :return:
      """
      count = 0
      for node_name in nodes:
            node = Node(label, name=node_name)
            self.graph.create(node)
            count += 1
            print(count, len(nodes))
      return

    def create_diseases_nodes(self, disease_info):
      """
      创建疾病节点的属性
      :param disease_info: list(Dict)
      :return:
      """
      count = 0
      for disease_dict in disease_info:
            node = Node("Disease", name=disease_dict['name'], age=disease_dict['age'],
                        infection=disease_dict['infection'], insurance=disease_dict['insurance'],
                        treatment=disease_dict['treatment'], checklist=disease_dict['checklist'],
                        period=disease_dict['period'], rate=disease_dict['rate'],
                        money=disease_dict['money'])
            self.graph.create(node)
            count += 1
            print(count)
      return

    def create_graphNodes(self):
      """
      创建知识图谱实体
      :return:
      """
      disease, symptom, alias, part, department, complication, drug, rel_alias, rel_symptom, rel_part, \
      rel_department, rel_complication, rel_drug, rel_infos = self.read_file()
      self.create_diseases_nodes(rel_infos)
      self.create_node("Symptom", symptom)
      self.create_node("Alias", alias)
      self.create_node("Part", part)
      self.create_node("Department", department)
      self.create_node("Complication", complication)
      self.create_node("Drug", drug)

      return

    def create_graphRels(self):
      disease, symptom, alias, part, department, complication, drug, rel_alias, rel_symptom, rel_part, \
      rel_department, rel_complication, rel_drug, rel_infos = self.read_file()

      self.create_relationship("Disease", "Alias", rel_alias, "ALIAS_IS", "别名")
      self.create_relationship("Disease", "Symptom", rel_symptom, "HAS_SYMPTOM", "症状")
      self.create_relationship("Disease", "Part", rel_part, "PART_IS", "发病部位")
      self.create_relationship("Disease", "Department", rel_department, "DEPARTMENT_IS", "所属科室")
      self.create_relationship("Disease", "Complication", rel_complication, "HAS_COMPLICATION", "并发症")
      self.create_relationship("Disease", "Drug", rel_drug, "HAS_DRUG", "药品")

    def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
      """
      创建实体关系边
      :param start_node:
      :param end_node:
      :param edges:
      :param rel_type:
      :param rel_name:
      :return:
      """
      count = 0
      # 去重处理
      set_edges = []
      for edge in edges:
            set_edges.append('###'.join(edge))
      all = len(set(set_edges))
      for edge in set(set_edges):
            edge = edge.split('###')
            p = edge
            q = edge
            query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' create (p)-->(q)" % (
                start_node, end_node, p, q, rel_type, rel_name)
            try:
                self.graph.run(query)
                count += 1
                print(rel_type, count, all)
            except Exception as e:
                print(e)
      return


if __name__ == "__main__":
    handler = MedicalGraph()
    handler.create_graphNodes()
    handler.create_graphRels()
报错如下:Traceback (most recent call last):
File "D:\anaconda\lib\site-packages\py2neo\database.py", line 88, in __new__
    inst = cls._instances
KeyError: '6fc7d439c7d566b2167c91a9b454580d'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "D:/pycharmpractice/kbqa_code/QASystemOnMedicalGraph-master/QASystemOnMedicalGraph-master/build_graph.py", line 201, in <module>
    handler = MedicalGraph()
File "D:/pycharmpractice/kbqa_code/QASystemOnMedicalGraph-master/QASystemOnMedicalGraph-master/build_graph.py", line 13, in __init__
    self.graph = Graph("http://localhost:7474", username="neo4j", password="")
File "D:\anaconda\lib\site-packages\py2neo\database.py", line 298, in __new__
    database = Database(uri, **settings)
File "D:\anaconda\lib\site-packages\py2neo\database.py", line 92, in __new__
    from py2neo.internal.http import HTTPDriver, HTTPSDriver
File "D:\anaconda\lib\site-packages\py2neo\internal\http.py", line 26, in <module>
    from neo4j.addressing import SocketAddress
ImportError: cannot import name 'SocketAddress' from 'neo4j.addressing' (D:\anaconda\lib\site-packages\neo4j\addressing.py)

suchocolate 发表于 2022-4-16 00:33:46

代码发出来,报错发全

不要留下遗憾 发表于 2022-4-16 10:11:00

suchocolate 发表于 2022-4-16 00:33
代码发出来,报错发全

好的好的

不要留下遗憾 发表于 2022-4-18 13:39:31

问题已解决,是因为py2neo版本问题
页: [1]
查看完整版本: python连接Neo4j失败导入错误ImportError: cannot import name \\\'SocketAddress\\\'