answer_search.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. from py2neo import Graph
  2. class AnswerSearcher:
  3. def __init__(self):
  4. self.g = Graph("bolt://localhost:7687", auth=("neo4j", "fdx3081475970"))
  5. self.num_limit = 20
  6. '''执行cypher查询,并返回相应结果'''
  7. def search_main(self, sqls):
  8. final_answers = []
  9. for sql_ in sqls:
  10. question_type = sql_['question_type']
  11. queries = sql_['sql']
  12. answers = []
  13. for query in queries:
  14. ress = self.g.run(query).data()
  15. answers += ress
  16. final_answer = self.answer_prettify(question_type, answers)
  17. if final_answer:
  18. final_answers.append(final_answer)
  19. return final_answers
  20. def get_entity(self, sqls):
  21. entity_lists = []
  22. for sql_ in sqls:
  23. question_type = sql_['question_type']
  24. queries = sql_['sql']
  25. answers = []
  26. for query in queries:
  27. ress = self.g.run(query).data()
  28. answers += ress
  29. entity_list = self.get_entity_list(question_type, answers)
  30. print("entity_list", entity_list)
  31. if entity_list:
  32. entity_lists.append(entity_list)
  33. return entity_lists
  34. def get_entity_list(self, question_type, answers):
  35. entity_list = []
  36. if not answers:
  37. return ''
  38. if question_type == 'query_des':
  39. entity_list = {
  40. "data": [],
  41. "links": [],
  42. "docs": []
  43. }
  44. seen_subjects = set()
  45. for i in answers:
  46. sub = str(i['m.name'])
  47. obj = str(i['n.name'])
  48. rel = str(i['r.name'])
  49. ossid = i['n.doc_id']
  50. file_name = i['n.doc_name']
  51. filePage = i['n.filePage']
  52. if sub not in seen_subjects:
  53. entity_list["data"].append({"name": sub, "category": "故障描述"})
  54. seen_subjects.add(sub)
  55. entity_list["data"].append({"name": obj, "category": rel})
  56. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  57. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  58. elif question_type == 'query_hmc':
  59. entity_list = {
  60. "data": [],
  61. "links": [],
  62. "docs": []
  63. }
  64. seen_subjects = set()
  65. for i in answers:
  66. sub = str(i['m.name'])
  67. obj = str(i['n.name'])
  68. rel = str(i['r.name'])
  69. ossid = i['n.doc_id']
  70. file_name = i['n.doc_name']
  71. filePage = i['n.filePage']
  72. if sub not in seen_subjects:
  73. entity_list["data"].append({"name": sub, "category": "HMC"})
  74. seen_subjects.add(sub)
  75. entity_list["data"].append({"name": obj, "category": rel})
  76. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  77. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  78. elif question_type == 'query_obj':
  79. entity_list = {
  80. "data": [],
  81. "links": [],
  82. "docs": []
  83. }
  84. seen_subjects = set()
  85. for i in answers:
  86. sub = str(i['m.name'])
  87. obj = str(i['n.name'])
  88. rel = str(i['r.name'])
  89. ossid = i['n.doc_id']
  90. file_name = i['n.doc_name']
  91. filePage = i['n.filePage']
  92. if sub not in seen_subjects:
  93. entity_list["data"].append({"name": sub, "category": "成品"})
  94. seen_subjects.add(sub)
  95. entity_list["data"].append({"name": obj, "category": rel})
  96. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  97. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  98. elif question_type == 'query_x_obj':
  99. entity_list = {
  100. "data": [],
  101. "links": [],
  102. "docs": []
  103. }
  104. seen_subjects = set()
  105. for i in answers:
  106. sub = str(i['m.name'])
  107. obj = str(i['n.name'])
  108. rel = str(i['r.name'])
  109. ossid = i['n.doc_id']
  110. file_name = i['n.doc_name']
  111. filePage = i['n.filePage']
  112. if sub not in seen_subjects:
  113. entity_list["data"].append({"name": obj, "category": "型号"})
  114. seen_subjects.add(obj)
  115. entity_list["data"].append({"name": sub, "category": rel})
  116. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  117. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  118. elif question_type == 'query_s_sys':
  119. entity_list = {
  120. "data": [],
  121. "links": [],
  122. "docs": []
  123. }
  124. seen_subjects = set()
  125. for i in answers:
  126. sub = str(i['m.name'])
  127. obj = str(i['n.name'])
  128. rel = str(i['r.name'])
  129. ossid = i['n.doc_id']
  130. file_name = i['n.doc_name']
  131. filePage = i['n.filePage']
  132. if sub not in seen_subjects:
  133. entity_list["data"].append({"name": sub, "category": "子系统"})
  134. seen_subjects.add(sub)
  135. entity_list["data"].append({"name": obj, "category": rel})
  136. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  137. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  138. elif question_type == 'query_system':
  139. entity_list = {
  140. "data": [],
  141. "links": [],
  142. "docs": []
  143. }
  144. seen_subjects = set()
  145. for i in answers:
  146. sub = str(i['m.name'])
  147. obj = str(i['n.name'])
  148. rel = str(i['r.name'])
  149. ossid = i['n.doc_id']
  150. file_name = i['n.doc_name']
  151. filePage = i['n.filePage']
  152. if sub not in seen_subjects:
  153. entity_list["data"].append({"name": sub, "category": "系统"})
  154. seen_subjects.add(sub)
  155. entity_list["data"].append({"name": obj, "category": rel})
  156. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  157. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  158. elif question_type == 'fault_des':
  159. entity_list = {
  160. "data": [],
  161. "links": [],
  162. "docs": []
  163. }
  164. seen_subjects = set()
  165. for i in answers:
  166. sub = str(i['m.name'])
  167. obj = str(i['n.name'])
  168. rel = str(i['r.name'])
  169. ossid = i['n.doc_id']
  170. file_name = i['n.doc_name']
  171. filePage = i['n.filePage']
  172. if sub not in seen_subjects:
  173. entity_list["data"].append({"name": sub, "category": "HMC"})
  174. seen_subjects.add(sub)
  175. entity_list["data"].append({"name": obj, "category": rel})
  176. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  177. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  178. elif question_type == 'fault_excluds':
  179. entity_list = {
  180. "data": [],
  181. "links": [],
  182. "docs": []
  183. }
  184. seen_subjects = set()
  185. for i in answers:
  186. sub = str(i['m.name'])
  187. obj = str(i['n.name'])
  188. rel = str(i['r.name'])
  189. ossid = i['n.doc_id']
  190. file_name = i['n.doc_name']
  191. filePage = i['n.filePage']
  192. a = i['a.name'] if 'a.name' in i else None
  193. b = i['b.name'] if 'b.name' in i else None
  194. c = i['c.name'] if 'c.name' in i else None
  195. if sub not in seen_subjects:
  196. entity_list["data"].append({"name": sub, "category": "HMC"})
  197. seen_subjects.add(sub)
  198. if a and b and c:
  199. entity_list["data"].append({"name": c, "category": b})
  200. entity_list["links"].append({"source": a, "target": c, "value": b})
  201. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  202. else:
  203. entity_list["data"].append({"name": obj, "category": rel})
  204. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  205. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  206. elif question_type == 'des_excluds':
  207. entity_list = {
  208. "data": [],
  209. "links": [],
  210. "docs": []
  211. }
  212. seen_subjects = set()
  213. for i in answers:
  214. sub = str(i['m.name'])
  215. obj = str(i['n.name'])
  216. rel = str(i['r.name'])
  217. ossid = i['n.doc_id']
  218. file_name = i['n.doc_name']
  219. filePage = i['n.filePage']
  220. a = i['a.name'] if 'a.name' in i else None
  221. b = i['b.name'] if 'b.name' in i else None
  222. c = i['c.name'] if 'c.name' in i else None
  223. if sub not in seen_subjects:
  224. entity_list["data"].append({"name": sub, "category": "故障名称"})
  225. seen_subjects.add(sub)
  226. if a and b and c:
  227. entity_list["data"].append({"name": c, "category": b})
  228. entity_list["links"].append({"source": a, "target": c, "value": b})
  229. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  230. else:
  231. entity_list["data"].append({"name": obj, "category": rel})
  232. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  233. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  234. elif question_type == 'fault_obj':
  235. entity_list = {
  236. "data": [],
  237. "links": [],
  238. "docs": []
  239. }
  240. seen_subjects = set()
  241. for i in answers:
  242. sub = str(i['m.name'])
  243. obj = str(i['n.name'])
  244. rel = str(i['r.name'])
  245. ossid = i['n.doc_id']
  246. file_name = i['n.doc_name']
  247. filePage = i['n.filePage']
  248. if sub not in seen_subjects:
  249. entity_list["data"].append({"name": sub, "category": "HMC"})
  250. seen_subjects.add(sub)
  251. entity_list["data"].append({"name": obj, "category": rel})
  252. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  253. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  254. elif question_type == 'hmc_system':
  255. entity_list = {
  256. "data": [],
  257. "links": [],
  258. "docs": []
  259. }
  260. seen_subjects = set()
  261. for i in answers:
  262. sub = str(i['m.name'])
  263. obj = str(i['n.name'])
  264. rel = str(i['r.name'])
  265. ossid = i['n.doc_id']
  266. file_name = i['n.doc_name']
  267. filePage = i['n.filePage']
  268. if sub not in seen_subjects:
  269. entity_list["data"].append({"name": sub, "category": "HMC"})
  270. seen_subjects.add(sub)
  271. entity_list["data"].append({"name": obj, "category": rel})
  272. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  273. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  274. elif question_type == 'sys_s_sys':
  275. entity_list = {
  276. "data": [],
  277. "links": [],
  278. "docs": []
  279. }
  280. seen_subjects = set()
  281. for i in answers:
  282. sub = str(i['m.name'])
  283. obj = str(i['n.name'])
  284. rel = str(i['r.name'])
  285. ossid = i['n.doc_id']
  286. file_name = str(i['n.doc_name'])
  287. filePage = i['n.filePage']
  288. if sub not in seen_subjects:
  289. entity_list["data"].append({"name": sub, "category": "系统"})
  290. seen_subjects.add(sub)
  291. entity_list["data"].append({"name": obj, "category": rel})
  292. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  293. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  294. elif question_type == 'sys_fault_obj':
  295. entity_list = {
  296. "data": [],
  297. "links": [],
  298. "docs": []
  299. }
  300. seen_subjects = set()
  301. for i in answers:
  302. sub = i['m.name']
  303. obj = i['n.name']
  304. rel = i['r.name']
  305. ossid = i['n.doc_id']
  306. file_name = i['n.doc_name']
  307. filePage = i['n.filePage']
  308. if sub not in seen_subjects:
  309. entity_list["data"].append({"name": sub, "category": "系统"})
  310. seen_subjects.add(sub)
  311. entity_list["data"].append({"name": obj, "category": rel})
  312. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  313. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  314. elif question_type == 'fault_obj_sys':
  315. entity_list = {
  316. "data": [],
  317. "links": [],
  318. "docs": []
  319. }
  320. seen_subjects = set()
  321. for i in answers:
  322. sub = i['m.name']
  323. obj = i['n.name']
  324. rel = i['r.name']
  325. ossid = i['m.doc_id']
  326. file_name = i['m.doc_name']
  327. filePage = i['n.filePage']
  328. if sub not in seen_subjects:
  329. entity_list["data"].append({"name": sub, "category": "成品"})
  330. seen_subjects.add(sub)
  331. entity_list["data"].append({"name": obj, "category": rel})
  332. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  333. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  334. elif question_type == 'fault_obj_fault_x_obj':
  335. entity_list = {
  336. "data": [],
  337. "links": [],
  338. "docs": []
  339. }
  340. seen_subjects = set()
  341. for i in answers:
  342. sub = i['m.name']
  343. obj = i['n.name']
  344. rel = i['r.name']
  345. ossid = i['n.doc_id']
  346. file_name = i['n.doc_name']
  347. filePage = i['n.filePage']
  348. if sub not in seen_subjects:
  349. entity_list["data"].append({"name": sub, "category": "成品"})
  350. seen_subjects.add(sub)
  351. entity_list["data"].append({"name": obj, "category": rel})
  352. entity_list["links"].append({"source": sub, "target": obj, "value": rel})
  353. entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
  354. return entity_list
  355. '''根据对应的qustion_type,调用相应的回复模板'''
  356. def answer_prettify(self, question_type, answers):
  357. final_answer = []
  358. if not answers:
  359. return ''
  360. if question_type == 'query_des':
  361. # 初始化集合用于存储去重后的尾实体及其关系
  362. desc_with_rel_set = set()
  363. # 遍历答案,同时获取头实体、关系和尾实体
  364. for answer in answers:
  365. subject = answer['m.name']
  366. rel = answer['r.name']
  367. desc = answer['n.name']
  368. # 将关系和尾实体组合成字符串并加入集合
  369. desc_with_rel_set.add(f"{rel}为{desc}")
  370. # 将集合转换为列表,并按需限制数量
  371. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  372. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  373. final_answer = '故障描述{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  374. elif question_type == 'query_hmc':
  375. # 初始化集合用于存储去重后的尾实体及其关系
  376. desc_with_rel_set = set()
  377. # 遍历答案,同时获取头实体、关系和尾实体
  378. for answer in answers:
  379. subject = answer['m.name']
  380. rel = answer['r.name']
  381. desc = answer['n.name']
  382. # 将关系和尾实体组合成字符串并加入集合
  383. desc_with_rel_set.add(f"{rel}为{desc}")
  384. # 将集合转换为列表,并按需限制数量
  385. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  386. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  387. final_answer = 'HMC码{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  388. elif question_type == 'query_obj':
  389. # 初始化集合用于存储去重后的尾实体及其关系
  390. desc_with_rel_set = set()
  391. # 遍历答案,同时获取头实体、关系和尾实体
  392. for answer in answers:
  393. subject = answer['m.name']
  394. rel = answer['r.name']
  395. desc = answer['n.name']
  396. # 将关系和尾实体组合成字符串并加入集合
  397. desc_with_rel_set.add(f"{rel}为{desc}")
  398. # 将集合转换为列表,并按需限制数量
  399. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  400. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  401. final_answer = '成品{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  402. elif question_type == 'query_x_obj':
  403. # 初始化集合用于存储去重后的尾实体及其关系
  404. desc_with_rel_set = set()
  405. # 遍历答案,同时获取头实体、关系和尾实体
  406. for answer in answers:
  407. subject = answer['m.name']
  408. rel = answer['r.name']
  409. desc = answer['n.name']
  410. # 将关系和尾实体组合成字符串并加入集合
  411. desc_with_rel_set.add(f"{rel}为{desc}")
  412. # 将集合转换为列表,并按需限制数量
  413. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  414. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  415. final_answer = '型号{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  416. elif question_type == 'query_s_sys':
  417. # 初始化集合用于存储去重后的尾实体及其关系
  418. desc_with_rel_set = set()
  419. # 遍历答案,同时获取头实体、关系和尾实体
  420. for answer in answers:
  421. subject = answer['m.name']
  422. rel = answer['r.name']
  423. desc = answer['n.name']
  424. # 将关系和尾实体组合成字符串并加入集合
  425. desc_with_rel_set.add(f"{rel}为{desc}")
  426. # 将集合转换为列表,并按需限制数量
  427. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  428. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  429. final_answer = '子系统{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  430. elif question_type == 'query_system':
  431. # 初始化集合用于存储去重后的尾实体及其关系
  432. desc_with_rel_set = set()
  433. # 遍历答案,同时获取头实体、关系和尾实体
  434. for answer in answers:
  435. subject = answer['m.name']
  436. rel = answer['r.name']
  437. desc = answer['n.name']
  438. # 将关系和尾实体组合成字符串并加入集合
  439. desc_with_rel_set.add(f"{rel}为{desc}")
  440. # 将集合转换为列表,并按需限制数量
  441. desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
  442. # 将头实体和与其有关联的尾实体及关系组合成最终的回答
  443. final_answer = '系统{0}{1}。'.format(subject, '; '.join(desc_with_rel))
  444. elif question_type == 'fault_des':
  445. desc = [i['n.name'] for i in answers]
  446. subject = answers[0]['m.name']
  447. final_answer = '{0}的故障现象是: {1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  448. elif question_type == 'fault_excluds':
  449. desc = []
  450. for i in answers:
  451. if 'c.name' in i and i['c.name']:
  452. desc.append(i['c.name'])
  453. elif 'n.name' in i:
  454. desc.append(i['n.name'])
  455. subject = answers[0]['m.name']
  456. final_answer = '发生{0}时应该{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  457. elif question_type == 'des_excluds':
  458. desc = []
  459. for i in answers:
  460. if 'c.name' in i and i['c.name']:
  461. desc.append(i['c.name'])
  462. elif 'n.name' in i:
  463. desc.append(i['n.name'])
  464. subject = answers[0]['m.name']
  465. final_answer = '发生{0}时应该{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  466. elif question_type == 'fault_obj':
  467. desc = [i['n.name'] for i in answers]
  468. subject = answers[0]['m.name']
  469. final_answer = 'HMC码{0}对应的部件位:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  470. elif question_type == 'hmc_system':
  471. desc = [i['n.name'] for i in answers]
  472. subject = answers[0]['m.name']
  473. final_answer = 'HMC码{0}对应的系统为{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  474. elif question_type == "sys_s_sys":
  475. desc = [i['n.name'] for i in answers]
  476. subject = answers[0]['m.name']
  477. final_answer = '{0}包含的子系统有:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  478. elif question_type == "sys_fault_obj":
  479. desc = [i['n.name'] for i in answers]
  480. subject = answers[0]['m.name']
  481. final_answer = '{0}包含的成品有:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  482. elif question_type == "fault_obj_sys":
  483. desc = [i['n.name'] for i in answers]
  484. subject = answers[0]['m.name']
  485. final_answer = '{0}属于{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  486. elif question_type == "fault_obj_fault_x_obj":
  487. desc = [i['n.name'] for i in answers]
  488. subject = answers[0]['m.name']
  489. final_answer = '{0}的型号为:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
  490. return final_answer
  491. if __name__ == '__main__':
  492. searcher = AnswerSearcher()