from py2neo import Graph class AnswerSearcher: def __init__(self): self.g = Graph( "bolt://127.0.0.1:7687", # host="127.0.0.1", # http_port=7474, # user="neo4j", # password="123456" # http_port=7687, # neo4j 服务器监听的端口号 user="neo4j", # 数据库user name,如果没有更改过,应该是neo4j password="123456") 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 '''根据对应的qustion_type,板调用相应的回复模''' def answer_prettify(self, question_type, answers): final_answer = [] if not answers: return '' if question_type == 'entity_cause': desc = [i['c.name'] for i in answers] subject = answers[0]['a.name'] final_answer = '{0}现象的原因包括:{1}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) elif question_type == 'parts': desc = [i['a.name'] for i in answers] subject = answers[0]['c.name'] final_answer = '{0}的性能故障可能有:{1}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) elif question_type == 'solve': desc = [i['c.name'] for i in answers] subject = answers[0]['a.name'] final_answer = '{0}的排故流程是:{1}'.format( subject, ';'.join(list(set(desc))[:self.num_limit])) elif question_type == 'entity_desc': subject = answers[0]['c.name'] result = {} for answer in answers: rel_name = answer['rel_name'] target_node_name = answer['target_nodes'] if rel_name not in result: result[rel_name] = [] result[rel_name].append(target_node_name) answer_list = [] for key in result: if result[key]: desc = '、'.join(result[key][0]) answer_list.append('{0}{1}有:{2}'.format(subject, key, desc)) final_answer = ';\n'.join(answer_list) elif question_type == 'entity_desc1': subject = answers[0]['a.name'] result = {} for answer in answers: rel_name = answer['rel_name'] source_node_name = answer['source_nodes'] if rel_name not in result: result[rel_name] = [] result[rel_name].append(source_node_name) answer_list = [] for key in result: if result[key]: desc = '、'.join(result[key][0]) answer_list.append('{0}被发出的{1}关系有:{2}'.format(subject, key, desc)) final_answer = ';'.join(answer_list) return final_answer if __name__ == '__main__': searcher = AnswerSearcher()