Add an edge to the graph.
(self, G, edge_element, graphml_keys)
| 922 | self.make_graph(graph_xml, graphml_keys, defaults, G) |
| 923 | |
| 924 | def add_edge(self, G, edge_element, graphml_keys): |
| 925 | """Add an edge to the graph.""" |
| 926 | # warn on finding unsupported ports tag |
| 927 | ports = edge_element.find(f"{{{self.NS_GRAPHML}}}port") |
| 928 | if ports is not None: |
| 929 | warnings.warn("GraphML port tag not supported.") |
| 930 | |
| 931 | # raise error if we find mixed directed and undirected edges |
| 932 | directed = edge_element.get("directed") |
| 933 | if G.is_directed() and directed == "false": |
| 934 | msg = "directed=false edge found in directed graph." |
| 935 | raise eg.EasyGraphError(msg) |
| 936 | if (not G.is_directed()) and directed == "true": |
| 937 | msg = "directed=true edge found in undi rected graph." |
| 938 | raise eg.EasyGraphError(msg) |
| 939 | |
| 940 | source = self.node_type(edge_element.get("source")) |
| 941 | target = self.node_type(edge_element.get("target")) |
| 942 | data = self.decode_data_elements(graphml_keys, edge_element) |
| 943 | # GraphML stores edge ids as an attribute |
| 944 | # EasyGraph uses them as keys in multigraphs too if no key |
| 945 | # attribute is specified |
| 946 | edge_id = edge_element.get("id") |
| 947 | if edge_id: |
| 948 | # self.edge_ids is used by `make_graph` method for non-multigraphs |
| 949 | self.edge_ids[source, target] = edge_id |
| 950 | try: |
| 951 | edge_id = self.edge_key_type(edge_id) |
| 952 | except ValueError: # Could not convert. |
| 953 | pass |
| 954 | else: |
| 955 | edge_id = data.get("key") |
| 956 | |
| 957 | if G.has_edge(source, target): |
| 958 | # mark this as a multigraph |
| 959 | self.multigraph = True |
| 960 | |
| 961 | # Use add_edges_from to avoid error with add_edge when `'key' in data` |
| 962 | # Note there is only one edge here... |
| 963 | G.add_edges_from([(source, target, edge_id, data)]) |
| 964 | |
| 965 | def decode_data_elements(self, graphml_keys, obj_xml): |
| 966 | """Use the key information to decode the data XML if present.""" |
no test coverage detected