123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 |
- from py2neo import Graph
- class AnswerSearcher:
- def __init__(self):
- self.g = Graph("bolt://localhost:7687", auth=("neo4j", "fdx3081475970"))
- self.num_limit = 20
- '''执行cypher查询,并返回相应结果'''
- def search_main(self, sqls):
- final_answers = []
- for sql_ in sqls:
- question_type = sql_['question_type']
- queries = sql_['sql']
- answers = []
- for query in queries:
- ress = self.g.run(query).data()
- answers += ress
- final_answer = self.answer_prettify(question_type, answers)
- if final_answer:
- final_answers.append(final_answer)
- return final_answers
- def get_entity(self, sqls):
- entity_lists = []
- for sql_ in sqls:
- question_type = sql_['question_type']
- queries = sql_['sql']
- answers = []
- for query in queries:
- ress = self.g.run(query).data()
- answers += ress
- entity_list = self.get_entity_list(question_type, answers)
- print("entity_list", entity_list)
- if entity_list:
- entity_lists.append(entity_list)
- return entity_lists
- def get_entity_list(self, question_type, answers):
- entity_list = []
- if not answers:
- return ''
- if question_type == 'query_des':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "故障描述"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'query_hmc':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "HMC"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'query_obj':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "成品"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'query_x_obj':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": obj, "category": "型号"})
- seen_subjects.add(obj)
- entity_list["data"].append({"name": sub, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'query_s_sys':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "子系统"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'query_system':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "系统"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'fault_des':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "HMC"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'fault_excluds':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- a = i['a.name'] if 'a.name' in i else None
- b = i['b.name'] if 'b.name' in i else None
- c = i['c.name'] if 'c.name' in i else None
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "HMC"})
- seen_subjects.add(sub)
- if a and b and c:
- entity_list["data"].append({"name": c, "category": b})
- entity_list["links"].append({"source": a, "target": c, "value": b})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- else:
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'des_excluds':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- a = i['a.name'] if 'a.name' in i else None
- b = i['b.name'] if 'b.name' in i else None
- c = i['c.name'] if 'c.name' in i else None
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "故障名称"})
- seen_subjects.add(sub)
- if a and b and c:
- entity_list["data"].append({"name": c, "category": b})
- entity_list["links"].append({"source": a, "target": c, "value": b})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- else:
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'fault_obj':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "HMC"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'hmc_system':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "HMC"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'sys_s_sys':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = str(i['m.name'])
- obj = str(i['n.name'])
- rel = str(i['r.name'])
- ossid = i['n.doc_id']
- file_name = str(i['n.doc_name'])
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "系统"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'sys_fault_obj':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = i['m.name']
- obj = i['n.name']
- rel = i['r.name']
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "系统"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'fault_obj_sys':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = i['m.name']
- obj = i['n.name']
- rel = i['r.name']
- ossid = i['m.doc_id']
- file_name = i['m.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "成品"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- elif question_type == 'fault_obj_fault_x_obj':
- entity_list = {
- "data": [],
- "links": [],
- "docs": []
- }
- seen_subjects = set()
- for i in answers:
- sub = i['m.name']
- obj = i['n.name']
- rel = i['r.name']
- ossid = i['n.doc_id']
- file_name = i['n.doc_name']
- filePage = i['n.filePage']
- if sub not in seen_subjects:
- entity_list["data"].append({"name": sub, "category": "成品"})
- seen_subjects.add(sub)
- entity_list["data"].append({"name": obj, "category": rel})
- entity_list["links"].append({"source": sub, "target": obj, "value": rel})
- entity_list['docs'].append({"ossId": ossid, "file_name": file_name, "filePage": filePage})
- return entity_list
- '''根据对应的qustion_type,调用相应的回复模板'''
- def answer_prettify(self, question_type, answers):
- final_answer = []
- if not answers:
- return ''
- if question_type == 'query_des':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = '故障描述{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'query_hmc':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = 'HMC码{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'query_obj':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = '成品{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'query_x_obj':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = '型号{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'query_s_sys':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = '子系统{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'query_system':
- # 初始化集合用于存储去重后的尾实体及其关系
- desc_with_rel_set = set()
- # 遍历答案,同时获取头实体、关系和尾实体
- for answer in answers:
- subject = answer['m.name']
- rel = answer['r.name']
- desc = answer['n.name']
- # 将关系和尾实体组合成字符串并加入集合
- desc_with_rel_set.add(f"{rel}为{desc}")
- # 将集合转换为列表,并按需限制数量
- desc_with_rel = list(desc_with_rel_set)[:self.num_limit]
- # 将头实体和与其有关联的尾实体及关系组合成最终的回答
- final_answer = '系统{0}{1}。'.format(subject, '; '.join(desc_with_rel))
- elif question_type == 'fault_des':
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = '{0}的故障现象是: {1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == 'fault_excluds':
- desc = []
- for i in answers:
- if 'c.name' in i and i['c.name']:
- desc.append(i['c.name'])
- elif 'n.name' in i:
- desc.append(i['n.name'])
- subject = answers[0]['m.name']
- final_answer = '发生{0}时应该{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == 'des_excluds':
- desc = []
- for i in answers:
- if 'c.name' in i and i['c.name']:
- desc.append(i['c.name'])
- elif 'n.name' in i:
- desc.append(i['n.name'])
- subject = answers[0]['m.name']
- final_answer = '发生{0}时应该{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == 'fault_obj':
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = 'HMC码{0}对应的部件位:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == 'hmc_system':
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = 'HMC码{0}对应的系统为{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == "sys_s_sys":
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = '{0}包含的子系统有:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == "sys_fault_obj":
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = '{0}包含的成品有:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == "fault_obj_sys":
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = '{0}属于{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- elif question_type == "fault_obj_fault_x_obj":
- desc = [i['n.name'] for i in answers]
- subject = answers[0]['m.name']
- final_answer = '{0}的型号为:{1}。'.format(subject, ';'.join(list(set(desc))[:self.num_limit]))
- return final_answer
- if __name__ == '__main__':
- searcher = AnswerSearcher()
|