class QuestionParser: '''构建实体节点''' def build_entitydict(self, args): entity_dict = {} for arg, types in args.items(): for type in types: if type not in entity_dict: entity_dict[type] = [arg] else: entity_dict[type].append(arg) return entity_dict '''解析主函数''' def parser_main(self, res_classify): args = res_classify['args'] entity_dict = self.build_entitydict(args) question_types = res_classify['question_types'] sqls = [] for question_type in question_types: sql_ = {} sql_['question_type'] = question_type sql = [] if question_type == 'parts': sql = self.sql_transfer(question_type, entity_dict.get('entity')) elif question_type == 'entity_cause': sql = self.sql_transfer(question_type, entity_dict.get('entity')) elif question_type == 'solve': sql = self.sql_transfer(question_type, entity_dict.get('entity')) elif question_type == 'entity_desc': sql = self.sql_transfer(question_type, entity_dict.get('entity')) elif question_type == 'entity_desc1': sql = self.sql_transfer(question_type, entity_dict.get('entity')) if sql: sql_['sql'] = sql sqls.append(sql_) return sqls '''针对不同的问题,分开进行处理''' def sql_transfer(self, question_type, entities): if not entities: return [] # 查询语句 sql = [] # 查询故障的原因 if question_type == 'entity_cause': sql = ["MATCH (a:故障现象{{name:'{0}'}})<-[:故障现象]-(b)-[:故障原因]->(c:故障原因) RETURN a.name, c.name ".format(i) for i in entities] #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])] # 查询部件的组成 elif question_type == 'parts': sql = ["MATCH (n {{name: '{0}'}})-[r1:Relation {{name: '包含'}}]->(m)RETURN n.name, m.name".format(i) for i in entities] # 查询故障的解决方法 elif question_type == 'solve': sql = ["MATCH (a:故障名称{{name:'{0}'}}) -[:排故流程]->(c:故障流程) RETURN a.name, c.name ".format(i) for i in entities] elif question_type == 'entity_desc': 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] elif question_type == 'entity_desc1': 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] # 已知检查查询故障 #elif question_type == 'check_entity': # 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] return sql if __name__ == '__main__': handler = QuestionParser()