question_parser.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. class QuestionParser:
  2. '''构建实体节点'''
  3. def build_entitydict(self, args):
  4. entity_dict = {}
  5. for arg, types in args.items():
  6. for type in types:
  7. if type not in entity_dict:
  8. entity_dict[type] = [arg]
  9. else:
  10. entity_dict[type].append(arg)
  11. return entity_dict
  12. '''解析主函数'''
  13. def parser_main(self, res_classify):
  14. args = res_classify['args']
  15. entity_dict = self.build_entitydict(args)
  16. question_types = res_classify['question_types']
  17. sqls = []
  18. for question_type in question_types:
  19. sql_ = {}
  20. sql_['question_type'] = question_type
  21. sql = []
  22. if question_type == 'parts':
  23. sql = self.sql_transfer(question_type, entity_dict.get('entity'))
  24. elif question_type == 'entity_cause':
  25. sql = self.sql_transfer(question_type, entity_dict.get('entity'))
  26. elif question_type == 'solve':
  27. sql = self.sql_transfer(question_type, entity_dict.get('entity'))
  28. elif question_type == 'entity_desc':
  29. sql = self.sql_transfer(question_type, entity_dict.get('entity'))
  30. elif question_type == 'entity_desc1':
  31. sql = self.sql_transfer(question_type, entity_dict.get('entity'))
  32. if sql:
  33. sql_['sql'] = sql
  34. sqls.append(sql_)
  35. return sqls
  36. '''针对不同的问题,分开进行处理'''
  37. def sql_transfer(self, question_type, entities):
  38. if not entities:
  39. return []
  40. # 查询语句
  41. sql = []
  42. # 查询故障的原因
  43. if question_type == 'entity_cause':
  44. sql = ["MATCH (a:故障现象{{name:'{0}'}})<-[:故障现象]-(b)-[:故障原因]->(c:故障原因) RETURN a.name, c.name ".format(i) for i in entities]
  45. #sql = ["MATCH (e1:Entity {{name: '{0}'}})-[:Relation]->(e2:Entity {{name: '{1}'}}) MATCH (e2)-[r1:Relation {{name: '故障原因'}}]->(e3:Entity) MATCH (e3)-[r2:Relation {{name: '部件故障'}}]->(e4:Entity) RETURN e1.name + e2.name, e3.name + e4.name".format(entities[0], entities[1])]
  46. # 查询部件的组成
  47. elif question_type == 'parts':
  48. sql = ["MATCH (n {{name: '{0}'}})-[r1:Relation {{name: '包含'}}]->(m)RETURN n.name, m.name".format(i) for i in entities]
  49. # 查询故障的解决方法
  50. elif question_type == 'solve':
  51. sql = ["MATCH (a:故障名称{{name:'{0}'}}) -[:排故流程]->(c:故障流程) RETURN a.name, c.name ".format(i) for i in entities]
  52. elif question_type == 'entity_desc':
  53. sql = ["MATCH (n:Entity {{name: '{0}'}})-[r:Relation]->(m) WITH n, r.name AS rel_name, COLLECT(m.name) AS target_nodes RETURN n.name, rel_name, target_nodes".format(i) for i in entities]
  54. elif question_type == 'entity_desc1':
  55. sql = ["MATCH (n)-[r:Relation]->(m:Entity {{name: '{0}'}})WITH m, r.name AS rel_name, COLLECT(n.name) AS source_nodes RETURN m.name, rel_name, source_nodes".format(i) for i in entities]
  56. # 已知检查查询故障
  57. #elif question_type == 'check_entity':
  58. # sql = ["MATCH (m:Entity)-[r:need_check]->(n:Check) where n.name = '{0}' return m.name, r.name, n.name".format(i) for i in entities]
  59. return sql
  60. if __name__ == '__main__':
  61. handler = QuestionParser()