annotate importFromOpenMind/importer/model2neo4j.py @ 23:45a823b5bf33

updated ismi2model importer and model2neo4j exporter.
author casties
date Wed, 23 Sep 2015 19:18:59 +0200
parents
children 5bdcb5805d29
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
23
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
1 import networkx as nx
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
2 from neo4jrestclient.client import GraphDatabase, Node
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
3 import sys
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
4
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
5 ## configure behaviour
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
6
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
7 # metworkx graph file
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
8 input_fn = 'ismi_graph.gpickle'
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
9
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
10 # label added to all nodes
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
11 project_label = '_ismi4'
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
12
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
13 # neo4j base URL
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
14 neo4jBaseURL = "http://localhost:7474/db/data/"
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
15
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
16
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
17 ## setup
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
18
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
19 n4j_nodes = {}
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
20 n4j_relations = {}
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
21
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
22
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
23 def fixName(name, is_src_rel=False, is_tar_rel=False, att_from_rel=False):
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
24 # these are too embarrassing...
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
25 if 'FLORUIT' in name:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
26 name = name.replace('FLORUIT', 'FLOURISH')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
27
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
28 elif 'floruit' in name:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
29 name = name.replace('floruit', 'flourish')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
30
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
31 if is_src_rel:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
32 #name = name + '>'
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
33 pass
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
34
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
35 if is_tar_rel:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
36 name = '<' + name
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
37
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
38 if att_from_rel:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
39 # clean up relations as attribute names
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
40 name = name.replace('is_', '')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
41 name = name.replace('has_', '')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
42 name = name.replace('was_', '')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
43 name = name.replace('_of', '')
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
44
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
45 return name
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
46
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
47
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
48 def copyNodes(nx_graph, n4j_graph):
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
49 """copy all nodes from nx_graph to n4j_graph"""
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
50
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
51 print("Copying nodes to Neo4J")
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
52 cnt = 0
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
53 for node_id in nx.nodes_iter(nx_graph):
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
54 attrs = nx_graph.node[node_id]
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
55 type = attrs['type']
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
56 ismi_id = attrs['ismi_id']
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
57 # create node with attributes
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
58 n4j_node = n4j_graph.nodes.create(**attrs)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
59 # add labels
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
60 n4j_node.labels.add([project_label, type])
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
61 # save reference
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
62 n4j_nodes[ismi_id] = n4j_node
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
63
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
64 cnt += 1
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
65 if cnt % 100 == 0:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
66 print(" %s"%cnt)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
67
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
68
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
69 def copyRelations(nx_graph, n4j_graph):
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
70 """copy all relations from nx_graph to n4j_graph"""
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
71
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
72 print("Copying relations to Neo4J")
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
73 cnt = 0
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
74 for nx_edge in nx.edges_iter(nx_graph):
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
75 (nx_src, nx_tar) = nx_edge
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
76 # get attributes of edge
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
77 attrs = nx_graph.edge[nx_src][nx_tar][0]
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
78 type = attrs['type']
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
79 # get ismi_id of source and target nodes
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
80 src_id = nx_graph.node[nx_src]['ismi_id']
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
81 tar_id = nx_graph.node[nx_tar]['ismi_id']
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
82 # get Neo4J nodes
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
83 src = n4j_nodes.get(src_id, None)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
84 if src is None:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
85 print("ERROR: src node %s missing!"%src_id)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
86 break
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
87
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
88 tar = n4j_nodes.get(tar_id, None)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
89 if tar is None:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
90 print("ERROR: tar node %s missing!"%tar_id)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
91 break
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
92
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
93 # create Neo4J relation
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
94 n4j_rel = n4j_graph.relationships.create(src, type, tar)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
95 # add attributes
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
96 n4j_rel.properties = attrs
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
97
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
98 cnt += 1
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
99 if cnt % 100 == 0:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
100 print(" %s"%cnt)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
101
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
102
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
103 ## main
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
104
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
105 print("Copy graph from networkx to Neo4J")
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
106
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
107 # read commandline parameters
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
108 if len(sys.argv) > 1:
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
109 input_fn = sys.argv[1]
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
110
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
111 # read networkx graph from pickle
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
112 print("Reading graph from %s"%input_fn)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
113 nx_graph = nx.read_gpickle(input_fn)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
114 print("Graph info: %s"%nx.info(nx_graph))
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
115
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
116 # open neo4j graph db
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
117 print("Opening Neo4J db at %s"%neo4jBaseURL)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
118 n4j_graph = GraphDatabase(neo4jBaseURL, username="neo4j", password="neo5j")
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
119
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
120 copyNodes(nx_graph, n4j_graph)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
121
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
122 copyRelations(nx_graph, n4j_graph)
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
123
45a823b5bf33 updated ismi2model importer and model2neo4j exporter.
casties
parents:
diff changeset
124 print("Done.")