def _find_vertex_subgraph_matching(self, subgraphs, action_target, vertex, scenario_vertex): """calculates subgraph matching for vertex iterates over all the subgraphs, and checks if the triggered vertex is in the same connected component as the action then run subgraph matching on the vertex and return its result, otherwise return an empty list of matches. """ matches = [] for subgraph in subgraphs: connected_component = self.get_connected_component( subgraph, action_target) is_switch_mode = \ connected_component.get_vertex(scenario_vertex.vertex_id) if is_switch_mode: initial_map = Mapping(scenario_vertex, vertex, True) mat = self._entity_graph.algo.sub_graph_matching( subgraph, initial_map) matches.append((False, mat)) else: matches.append((True, [])) return matches
def _evaluate_and_condition(self, condition, element, scenario_element): condition_g = create_graph("scenario condition") for term in condition: if not term.positive: # todo(erosensw): add support for NOT clauses LOG.error('Unsupported template with NOT operator') return [] if term.type == ENTITY: term.variable[VProps.IS_DELETED] = False condition_g.add_vertex(term.variable) else: # type = relationship edge_desc = term.variable self._set_relationship_not_deleted(edge_desc) self._add_relationship(condition_g, edge_desc) if isinstance(element, Vertex): initial_map = Mapping(scenario_element, element, True) else: initial_map = Mapping(scenario_element.edge, element, False) return self._graph_algs.sub_graph_matching(condition_g, [initial_map])
def _filtered_subgraph_matching(self, ge_v_id, sge_v_id, subgraph, validate): """Runs subgraph_matching on edges vertices with filtering Runs subgraph_matching on edges vertices after checking if that vertex has real neighbors in the entity graph. """ if self.graph.neighbors( ge_v_id, edge_attr_filter={EProps.VITRAGE_IS_DELETED: False}): template_vertex = subgraph.get_vertex(sge_v_id) graph_vertex = self.graph.get_vertex(ge_v_id) match = Mapping(template_vertex, graph_vertex, True) return subgraph_matching(self.graph, subgraph, [match], validate) return []
def _find_edge_subgraph_matching(self, subgraphs, action_target, edge, scenario_edge): """calculates subgraph matching for edge iterates over all the subgraphs, and checks if the triggered edge is a negative edge then mark it as deleted=false and negative=false so that subgraph matching on that edge will work correctly. after running subgraph matching, we need to remove the negative vertices that were added due to the change above. """ matches = [] for subgraph in subgraphs: subgraph_edge = subgraph.get_edge(scenario_edge.source.vertex_id, scenario_edge.target.vertex_id, scenario_edge.edge.label) if not subgraph_edge: continue is_switch_mode = subgraph_edge.get(NEG_CONDITION, False) connected_component = self.get_connected_component(subgraph, action_target) # change the is_deleted and negative_condition props to false when # is_switch_mode=true so that when we have an event on a # negative_condition=true edge it will find the correct subgraph self._switch_edge_negative_props(is_switch_mode, scenario_edge, subgraph, False) initial_map = Mapping(scenario_edge.edge, edge, False) curr_matches = \ self._entity_graph.algo.sub_graph_matching(subgraph, initial_map) # switch back to the original values self._switch_edge_negative_props(is_switch_mode, scenario_edge, subgraph, True) self._remove_negative_vertices_from_matches(curr_matches, connected_component) matches.append((is_switch_mode, curr_matches)) return matches