comparison importFromOpenMind/importer/compare_models.py @ 47:378dcb66a27f

new compare_models comparing the existence of nodes and relations in two graphs. fixed bugs in ismixml2model.
author casties
date Mon, 06 Feb 2017 18:44:43 +0100
parents
children 6625019a0c96
comparison
equal deleted inserted replaced
46:f3945ef1e6a4 47:378dcb66a27f
1 import networkx as nx
2 import sys
3 import csv
4
5 ## configure behaviour
6
7 # metworkx graph files
8 input1_fn = 'ismi_graph1.gpickle'
9 input2_fn = 'ismi_graph2.gpickle'
10
11 # name of type attribute
12 node_type_attribute = '_type'
13 rel_type_attribute = '_type'
14
15 # active log levels for logging
16 logLevels = {'DEBUG', 'INFO', 'WARNING', 'ERROR', 'SYSMSG'}
17 #logLevels = {'INFO', 'WARNING', 'ERROR', 'SYSMSG'}
18 #logLevels = {'INFO', 'ERROR', 'SYSMSG'}
19
20 def log(level, message):
21 if level in logLevels:
22 print("%s: %s"%(level, message))
23
24
25 def invertRelations(nx_graph):
26 """Add inverse relations to each relation"""
27
28 print("Adding inverse relations.")
29 # copy list of edges because we add edges in the loop
30 edges = nx.edges(nx_graph)[:]
31 # iterate list
32 cnt = 0
33 for nx_edge in edges:
34 (nx_src, nx_tar) = nx_edge
35 # get attributes of edge
36 rel_attrs = nx_graph.edge[nx_src][nx_tar][0][:]
37 rel_type = rel_attrs[rel_type_attribute]
38 rel_id = rel_attrs['ismi_id']
39 # create new relation
40 rel_attrs[rel_type_attribute] = fixName(rel_type, is_tar_rel=True)
41 rel_attrs['ismi_id': -rel_id]
42 nx_graph.add_edge(nx_tar, nx_src, attr_dict=invrel_atts)
43
44 cnt += 1
45 if cnt % 100 == 0:
46 print(" %s relations"%cnt)
47
48
49 def compare_nodes(nx_graph1, nx_graph2):
50 """compare nodes of two graphs"""
51
52 log('INFO', "Compare graph nodes: %s vs %s"%(repr(nx_graph1), repr(nx_graph2)))
53 cnt = 0
54 missing_nodes1 = []
55 missing_nodes2 = []
56 # iterate all nodes in graph 1
57 for n in nx.nodes_iter(nx_graph1):
58 #attrs = nx_graph.node[n]
59
60 if not nx_graph2.has_node(n):
61 missing_nodes2.append(n)
62
63 if len(missing_nodes2) > 0:
64 log('WARNING', "%s nodes missing in graph 2"%len(missing_nodes2))
65 log('DEBUG', "nodes: %s"%missing_nodes2)
66 #log('DEBUG', "nodes: %s"%([nx_graph1.node[n] for n in missing_nodes2]))
67
68 # iterate all nodes in graph 2
69 for n in nx.nodes_iter(nx_graph2):
70 #attrs = nx_graph.node[n]
71
72 if not nx_graph1.has_node(n):
73 missing_nodes1.append(n)
74
75 if len(missing_nodes1) > 0:
76 log('WARNING', "%s nodes missing in graph 1"%len(missing_nodes1))
77 log('DEBUG', "nodes: %s"%(missing_nodes1))
78
79
80 def compare_relations(nx_graph1, nx_graph2):
81 """compare relations of two graphs"""
82
83 log('INFO', "Compare graph relations: %s vs %s"%(repr(nx_graph1), repr(nx_graph2)))
84 cnt = 0
85 missing_rels1 = []
86 missing_rels2 = []
87 # iterate all edges in graph 1
88 for (s, t) in nx.edges_iter(nx_graph1):
89
90 if not nx_graph2.has_edge(s, t):
91 missing_rels2.append((s,t))
92
93 if len(missing_rels2) > 0:
94 log('WARNING', "%s relations missing in graph 2"%len(missing_rels2))
95 log('DEBUG', "relations: %s"%missing_rels2)
96 #log('DEBUG', "nodes: %s"%([nx_graph1.node[n] for n in missing_nodes2]))
97
98 # iterate all nodes in graph 2
99 for (s, t) in nx.edges_iter(nx_graph2):
100 #attrs = nx_graph.node[n]
101
102 if not nx_graph1.has_edge(s, t):
103 missing_rels1.append((s,t))
104
105 if len(missing_rels1) > 0:
106 log('WARNING', "%s relations missing in graph 1"%len(missing_rels1))
107 log('DEBUG', "relations: %s"%(missing_rels1))
108
109
110 ## main
111
112 print("Modify networkx graph")
113
114 # read commandline parameters
115 if len(sys.argv) > 2:
116 input1_fn = sys.argv[1]
117 input2_fn = sys.argv[2]
118
119 # read networkx graph from pickle
120 print("Reading graph 1 from %s"%input1_fn)
121 nx_graph1 = nx.read_gpickle(input1_fn)
122 print("Graph 1 info: %s"%nx.info(nx_graph1))
123
124 print("Reading graph 2 from %s"%input2_fn)
125 nx_graph2 = nx.read_gpickle(input2_fn)
126 print("Graph 2 info: %s"%nx.info(nx_graph2))
127
128 # operate
129 compare_nodes(nx_graph1, nx_graph2)
130 compare_relations(nx_graph1, nx_graph2)
131
132
133 print("Done.")