process_new.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. from time import time
  2. from py2neo import Graph, Node, Relationship, Subgraph
  3. import json
  4. import pandas as pd
  5. import re
  6. # 读取Excel文件
  7. def excel_to_json(excel_file, json_file):
  8. # 加载Excel文件
  9. data_frame = pd.read_excel(excel_file)
  10. # 将DataFrame转换为JSON字符串
  11. json_data = data_frame.to_json(orient='records', force_ascii=False)
  12. # 写入到JSON文件
  13. with open(json_file, 'w', encoding='utf-8') as f:
  14. f.write(json_data)
  15. print(f"转换完成,JSON文件已保存至:{json_file}")
  16. # 示例用法
  17. excel_file_path = r'C:\Users\Machenike\Desktop\xn_data.xlsx' # Excel文件路径
  18. json_file_path = r'D:\hiddz\KG_QA\T_Neo\data.json' # 输出的JSON文件路径
  19. excel_to_json(excel_file_path, json_file_path)
  20. class FaultGraph:
  21. def __getinitargs__(self):
  22. self.data_path = json_file_path
  23. def read_nodes(self):
  24. hmcs = [] # 故障名称
  25. describs = [] # 故障日期
  26. systems = [] # 故障现象
  27. s_systems = [] # 所属系统
  28. excludes = [] # 专业
  29. objs = [] # 故障产品或部位
  30. x_objects = [] # 故障原因
  31. plans = [] # 排除方法
  32. doc_id = []
  33. doc_name = []
  34. fault_infos = []
  35. rels_des = []
  36. rels_sys = []
  37. sys_sys = []
  38. rels_excludes = []
  39. rels_objs = []
  40. rels_obj_obj = []
  41. sys_objs = []
  42. plan_sys = []
  43. count = 0
  44. with open('data.json', "r", encoding='utf-8') as f:
  45. data = json.load(f)
  46. for i in data:
  47. fault_dict = {}
  48. count += 1
  49. HMC = str(i['HMC'])
  50. fault_dict['HMC'] = HMC
  51. fault_dict['故障描述'] = ''
  52. fault_dict['维修策略'] = ''
  53. fault_dict['系统'] = ''
  54. fault_dict['子系统'] = ''
  55. fault_dict['成品'] = ''
  56. fault_dict['型号'] = ''
  57. fault_dict['机型'] = ''
  58. fault_dict['文档id'] = ''
  59. fault_dict['文档名称'] = ''
  60. if 'HMC' in i:
  61. fault_dict['HMC'] = i['HMC']
  62. fault_dict['文档id'] = i['文档id']
  63. fault_dict['文档名称'] = i['文档名称']
  64. hmcs.append((i['HMC'], i['文档id'], i['文档名称']))
  65. if '故障描述' in i:
  66. fault_dict['故障描述'] = i['故障描述']
  67. fault_dict['文档id'] = i['文档id']
  68. fault_dict['文档名称'] = i['文档名称']
  69. rels_des.append([HMC, i['故障描述']])
  70. describs.append((i['故障描述'], i['文档id'], i['文档名称']))
  71. if '机型' in i:
  72. fault_dict['机型'] = i['机型']
  73. fault_dict['文档id'] = i['文档id']
  74. fault_dict['文档名称'] = i['文档名称']
  75. plans.append((i['机型'], i['文档id'], i['文档名称']))
  76. plan_sys.append([i['机型'], i['系统']])
  77. if '系统' in i:
  78. fault_dict['系统'] = i['系统']
  79. fault_dict['文档id'] = i['文档id']
  80. fault_dict['文档名称'] = i['文档名称']
  81. systems.append((i['系统'], i['文档id'], i['文档名称']))
  82. rels_sys.append([HMC, i['系统']])
  83. if '子系统' in i:
  84. fault_dict['子系统'] = i['子系统']
  85. fault_dict['文档id'] = i['文档id']
  86. fault_dict['文档名称'] = i['文档名称']
  87. if i['子系统'] != None:
  88. s_systems.append((i['子系统'], i['文档id'], i['文档名称']))
  89. else:
  90. continue
  91. sys_sys.append([i['系统'], i['子系统']])
  92. if '维修策略' in i:
  93. fault_dict['维修策略'] = i['维修策略']
  94. fault_dict['文档id'] = i['文档id']
  95. fault_dict['文档名称'] = i['文档名称']
  96. excludes.append((i['维修策略'], i['文档id'], i['文档名称']))
  97. rels_excludes.append([HMC, i['维修策略']])
  98. rels_excludes.append([i['故障描述'], i['维修策略']])
  99. if '成品' in i:
  100. fault_dict['成品'] = i['成品']
  101. fault_dict['文档id'] = i['文档id']
  102. fault_dict['文档名称'] = i['文档名称']
  103. objs.append((i['成品'], i['文档id'], i['文档名称']))
  104. rels_objs.append([HMC, i['成品']])
  105. sys_objs.append([i['子系统'], i['成品']])
  106. if '型号' in i:
  107. fault_dict['型号'] = i['型号']
  108. fault_dict['文档id'] = i['文档id']
  109. fault_dict['文档名称'] = i['文档名称']
  110. x_objects.append((i['型号'], i['文档id'], i['文档名称']))
  111. rels_obj_obj.append([i['成品'], i['型号']])
  112. if '文档id' in i:
  113. fault_dict['文档id'] = i['文档id']
  114. doc_id.append(i['文档id'])
  115. if '文档名称' in i:
  116. fault_dict['文档名称'] = i['文档名称']
  117. doc_name.append(i['文档名称'])
  118. fault_infos.append(fault_dict)
  119. return set(hmcs), set(describs), set(systems), set(s_systems), set(excludes), set(objs), set(x_objects), set(plans),\
  120. set(doc_id), set(doc_name), fault_infos, rels_des, rels_sys, sys_sys, rels_excludes, rels_objs, rels_obj_obj, sys_objs, plan_sys
  121. '''建立节点'''
  122. def create_node(self, label, nodes):
  123. count = 0
  124. nodess = []
  125. for node_name in nodes:
  126. # 检查node_name是否是三元组
  127. if isinstance(node_name, (tuple, list)) and len(node_name) == 3:
  128. node = Node(label, name=node_name[0], doc_id=node_name[1], doc_name=node_name[2])
  129. nodess.append(node)
  130. count += 1
  131. # 如果是单个字符串,我们可以将其转为一个默认的doc_id和doc_name
  132. elif isinstance(node_name, str):
  133. node = Node(label, name=node_name, doc_id='default_id', doc_name='default_name')
  134. nodess.append(node)
  135. count += 1
  136. else:
  137. print(f"Warning: Invalid node format {node_name}")
  138. return nodess
  139. '''创建知识图谱中心故障的节点'''
  140. def create_fault_nodes(self, fault_infos):
  141. count = 0
  142. nodes = []
  143. for fault_dict in fault_infos:
  144. node_properties = Node("Fault", name=fault_dict['HMC'], fault_des=fault_dict['故障描述'],
  145. fault_excluds=fault_dict['维修策略'],
  146. systems=fault_dict['系统'], s_sys=fault_dict['子系统'], fault_obj=fault_dict['成品'],
  147. fault_x_obj=fault_dict['型号'],
  148. plans=fault_dict['机型'])
  149. node_properties = {k: v for k, v in node_properties.items() if v is not None or v != ''}
  150. node = Node('Fault', **node_properties)
  151. nodes.append(node)
  152. count += 1
  153. return nodes
  154. '''创建知识图谱实体节点类型schema'''
  155. def create_graphnodes(self):
  156. hmcs, describs, systems, s_systems, excludes, objs, x_objects, plans, doc_id, doc_name, fault_infos, rels_des, \
  157. rels_sys, sys_sys, rels_excludes, rels_objs, rels_obj_obj, sys_objs, plan_sys = self.read_nodes()
  158. a = self.create_fault_nodes(fault_infos)
  159. b = self.create_node('HMC', hmcs)
  160. c = self.create_node('故障描述', describs)
  161. d = self.create_node('系统', systems)
  162. e = self.create_node('子系统', s_systems)
  163. f = self.create_node('维修策略', excludes)
  164. g = self.create_node('成品', objs)
  165. h = self.create_node('型号', x_objects)
  166. i = self.create_node('机型', plans)
  167. return a + b + c + d + e + f + g + h + i
  168. '''创建实体关系边'''
  169. def create_graphrels(self):
  170. hmcs, describs, systems, s_systems, excludes, objs, x_objects, plans, doc_id, doc_name, fault_infos, rels_des, \
  171. rels_sys, sys_sys, rels_excludes, rels_objs, rels_obj_obj, sys_objs, plan_sys = self.read_nodes()
  172. a = self.create_relationship('name', 'describ', rels_des, '故障描述', '故障描述')
  173. b = self.create_relationship('name', 'systems', rels_sys, '系统', '系统')
  174. c = self.create_relationship('name', 'excludes', rels_excludes, '维修策略', '维修策略')
  175. d = self.create_relationship('name', 'object', rels_objs, '成品', '成品')
  176. e = self.create_relationship('object', 'x_object', rels_obj_obj, '型号', '型号')
  177. f = self.create_relationship('name', 'system', sys_sys, '子系统', '子系统')
  178. g = self.create_relationship('name', 'object', sys_objs, '成品', '成品')
  179. h = self.create_relationship('plan', 'system', plan_sys, '系统', '系统')
  180. return a + b + c + d + e + f + g + h
  181. '''创建实体关联边'''
  182. def create_relationship(self, start_node, end_node, edges, rel_type, rel_name):
  183. count = 0
  184. # 去重处理
  185. relationships = []
  186. set_edges = []
  187. for edge in edges:
  188. if len(edge) == 2 and all(isinstance(item, str) for item in edge):
  189. set_edges.append('###'.join(edge))
  190. else:
  191. print(f'warning: Invaild edge {edge}. Ignoring.')
  192. for edge in set(set_edges):
  193. edge = edge.split('###')
  194. p = edge[0]
  195. q = edge[1]
  196. query = "match(p:%s),(q:%s) where p.name='%s'and q.name='%s' merge (p)-[rel:%s{name:'%s'}]->(q)" % (
  197. start_node, end_node, p, q, rel_type, rel_name)
  198. relationships.append(query)
  199. try:
  200. count += 1
  201. except Exception as e:
  202. print()
  203. return relationships
  204. class ProgressBar:
  205. def __init__(self, total, name='', mode=0):
  206. self.total = total
  207. self.name = name
  208. modes = (
  209. lambda n: f"进度|{'=' * n}{'>'}{'·' * (100 - n)}"[:-1] + f"| {n}% |",
  210. lambda n: f"进度|{'█' * n:100s}| {n}% |",
  211. lambda n: f"\033[31m{'♥' * n}{'♡' * (100 - n)} 进度{n}♥\033[0m",
  212. lambda n: f"\033[46m进度{' ' * n}{n}% \033[44m{' ' * (100 - n)}\033[0m",
  213. )
  214. mode = 0 if mode > 3 else mode
  215. self.mode = modes[mode]
  216. def now(self, n):
  217. if BAR:
  218. n_ = 100 * n // self.total
  219. print(f"\r{self.name}: {self.mode(n_)} [{n:05d} / {self.total}]", end='', flush=True)
  220. def end(self, name):
  221. print(name)
  222. BAR = True
  223. t0 = time()
  224. if __name__ == '__main__':
  225. handler = FaultGraph()
  226. graphnodes = handler.create_graphnodes()
  227. graphrels = handler.create_graphrels()
  228. print(f"匹配所用时间:{time() - t0:.1f}秒")
  229. print('正在创建图谱 . . . . . .', end='')
  230. graph = Graph("bolt://localhost:7687", auth=("neo4j", "fdx3081475970"))
  231. dicts = {}
  232. for i in graphnodes:
  233. dicts[i['name']] = i
  234. import numpy as np
  235. len(np.array(graphrels))
  236. p = ProgressBar(len(np.array(graphrels)), '匹配进度', mode=3)
  237. s = 0
  238. relationships = []
  239. for i in graphrels:
  240. p.now(s)
  241. n = i.split(' ')[2].split("'")[1]
  242. if re.match("^\d+$", n):
  243. n = int(n)
  244. m = i.split("'")[3]
  245. rr = i.split('[')[-1].split(']')[0][4:].split("'")[1]
  246. r = i.split('[')[-1].split(':')[1].split('{')[0]
  247. relationships.append(Relationship(dicts[n], r, dicts[m], name=rr))
  248. s += 1
  249. print(f"匹配所用时间:{time() - t0:.1f}秒")
  250. print('数据正在导入数据库......')
  251. graph.create(Subgraph(nodes=graphnodes, relationships=relationships))
  252. print('\r知识图谱数据库创建完成 !!')
  253. print(f"总体所用时间:{time() - t0:.1f}秒")