neo4j_bolt 0.1.15 → 0.1.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 04aa3226c239b35ccde7096230fd8421734dae517029af0501bf5381892b16e4
4
- data.tar.gz: b267b7da10112ea640f326531c8db9260d9ea64fd722c9daa8f95a5473d8b740
3
+ metadata.gz: ceadde284e1bf7c95b86a4929785fa092369144c66ade7c41c0eb956bf8ffa5b
4
+ data.tar.gz: 0ca383b2eeff7e0346cf51b1d7d64e86d81fe7019243118b8ab1bb6820ae043a
5
5
  SHA512:
6
- metadata.gz: 9c25238c42c83abdcab871eea6b2dadba8fe7c0ef3e40ce56ef1a161a7b2763f95b618f00d67aa24d766337ac20f0047263c0bca7921c532647c5c24fcf4f413
7
- data.tar.gz: c6f653050a7928ca389aac06ad37b508e5b967745f557c5fcf920eeb0c0471ab83c37b085d2d6c5478de4f91fcbc1cf1fc1068b56bdea0000434f4425d11eba6
6
+ metadata.gz: 40740b34b21c415f681e4542653caa2ac344ff5ff7546cf8fdefa9d34f45d61cbf90e0c6a9d5d45168c01327924bf53e3514936409bbef624862dea1ca25f47a
7
+ data.tar.gz: ce48d7167cf692056442acdcae26c346a0f4d27cf5a7365467f64b72f0e426e07eb2da847d752f8987ddb8c1d17c50937bde913ef8d9755abbc5fa350a1874e4
data/Gemfile.lock CHANGED
@@ -1,14 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- neo4j_bolt (0.1.15)
4
+ neo4j_bolt (0.1.16)
5
5
  gli
6
+ pry
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
9
10
  specs:
11
+ coderay (1.1.3)
10
12
  diff-lcs (1.5.0)
11
13
  gli (2.21.0)
14
+ method_source (1.0.0)
15
+ pry (0.14.1)
16
+ coderay (~> 1.1)
17
+ method_source (~> 1.0)
12
18
  rake (12.3.3)
13
19
  rspec (3.11.0)
14
20
  rspec-core (~> 3.11.0)
data/README.md CHANGED
@@ -1,6 +1,22 @@
1
1
  # Neo4jBolt
2
2
 
3
- A Neo4j/Bolt driver written in pure Ruby. Currently only supporting Neo4j 4.4. Caution: This gem is not feature complete, and also the documention is not complete yet.
3
+ A Neo4j/Bolt driver written in pure Ruby. **Currently only supporting Neo4j 4.4 with Bolt 4.4.** Contains a CLI tool which can dump databases, load database dumps, and visualize database contents.
4
+
5
+ Caution: This gem is not feature complete regarding Neo4j and Bolt. Nevertheless, it is used successfully in production – make sure it supports the features you need.
6
+
7
+ - PackStream:
8
+ - data types:
9
+ - supported: Null, Boolean, Integer, Float, String, List, Dictionary, Structure
10
+ - not supported: Bytes
11
+ - structures:
12
+ - supported: Node, Relationship
13
+ - not supported: UnboundRelationship, Path, Date, Time, LocalTime, DateTime, DateTimeZoneId, LocalDateTime, Duration, Point2D, Point3D
14
+ - Bolt Protocol:
15
+ - supported: transactions
16
+ - not supported:
17
+ - auto transactions (all transactions are explicit in Neo4jBolt)
18
+ - routing
19
+ - interrupt
4
20
 
5
21
  ## Installation
6
22
 
@@ -18,15 +34,15 @@ Or install it yourself as:
18
34
 
19
35
  $ gem install neo4j_bolt
20
36
 
21
- ## Usage
22
-
23
- In order to use this gem, you need a running Neo4j database. You can start one using the following command:
37
+ In order to use this gem, you need a running Neo4j database. Chances are you already have a Neo4j database running if you're reading this. Otherwise, you can start one via Docker using the following command:
24
38
 
25
39
  ```
26
40
  docker run --rm --env NEO4J_AUTH=none --publish 7687:7687 neo4j:4.4-community
27
41
  ```
28
42
 
29
- ### Connecting to a Neo4j database
43
+ If you want the Browser interface at http://localhost:7474/, additionaly specify `--publish 7474:7474`.
44
+
45
+ ## Connecting to a Neo4j database
30
46
 
31
47
  Specify your Bolt host and port (if you omit this it will be localhost:7687 by default):
32
48
 
@@ -35,10 +51,9 @@ Neo4jBolt.bolt_host = 'localhost'
35
51
  Neo4jBolt.bolt_port = 7687
36
52
  ```
37
53
 
38
- Use `cleanup_neo4j` to disconnect (this is important when running a web app – it might be a good idea to close a socket once we're done with it so we don't run out of ports).
39
-
54
+ Use `Neo4jBolt::cleanup_neo4j` to disconnect (this is important when running a web app – it might be a good idea to close a socket once we're done with it so we don't run out of available ports).
40
55
 
41
- ### Running queries
56
+ ## Running queries
42
57
 
43
58
  Use `neo4j_query` to run a query and receive all results:
44
59
 
@@ -55,8 +70,8 @@ end
55
70
 
56
71
  Using streaming avoids memory hog since it prevents having to read all entries into memory before handling them. Nodes are returned as `Neo4jBolt::Node`, relationships as `Neo4jBolt::Relationship`. Both are subclasses of `Hash`, providing access to all properties plus a few extra details:
57
72
 
58
- - `Neo4jBolt::Node`: `id`, `labels`
59
- - `Neo4jBolt::Relationship`: `id`, `start_node_id`, `end_node_id`, `type`
73
+ - `Neo4jBolt::Node` attributes: `id`, `labels`
74
+ - `Neo4jBolt::Relationship` attributes: `id`, `start_node_id`, `end_node_id`, `type`
60
75
 
61
76
  ```ruby
62
77
  node = neo4j_query_expect_one("CREATE (n:Node {a: 1, b: 2}) RETURN n;")['n']
@@ -68,7 +83,11 @@ puts node.labels
68
83
  puts node.keys
69
84
  node.each_pair { |k, v| puts "#{k}: #{v}" }
70
85
  puts node.to_json
86
+ puts "a: #{node[:a]}"
71
87
  ```
88
+
89
+ While values returned by Neo4j can be accesses via string keys (`['n']` in the example above), property keys of nodes and relationships are converted to symbols (`node[:a]`).
90
+
72
91
  Use `neo4j_query_expect_one` if you want to make sure there's exactly one entry to be returned:
73
92
 
74
93
  ```ruby
@@ -77,6 +96,81 @@ node = neo4j_query_expect_one("MATCH (n) RETURN n LIMIT 1;")['n']
77
96
 
78
97
  If there's zero, two, or more results, this will raise a `ExpectedOneResultError`.
79
98
 
99
+ ## Setting up constraints and indexes
100
+
101
+ Use `setup_constraints_and_indexes` like this:
102
+
103
+ ```ruby
104
+ CONSTRAINTS_LIST = ['User/email', 'Session/sid']
105
+ INDEX_LIST = ['Session/expires']
106
+ setup_constraints_and_indexes(CONSTRAINTS_LIST, INDEX_LIST)
107
+ ```
108
+
109
+ This setup up two uniqueness constraints and one index:
110
+ - the `email` property of all nodes with label `User` must be unique
111
+ - the `sid` property of all nodes with label `Session` must be unique
112
+ - the `expires` property of all nodes with label `Session` gets indexed for faster lookup
113
+
114
+ Neo4jBolt prefixes all constraints and indexes declared this way with `neo4j_bolt_` and it will remove all such entries previously declared (as detected by the prefix) and not passed to `setup_constraints_and_indexes`. That way, constraints and indexes can be added and removed.
115
+
116
+ Neo4jBolt does not currently support putting constraints on relationships or declaring indexes on relationships or combining several properties into one uniqueness constraint. You are, however, free to declare these constraints and indexes via Cypher yourself.
117
+
118
+ ## Housekeeping and inspection
119
+
120
+ Use the `neo4j_bolt` command line tool to perform various tasks regarding your database:
121
+
122
+ | Command | Description |
123
+ | ------- | ----------- |
124
+ | `neo4j_bolt console` | launch Pry console with Neo4jBolt |
125
+ | `neo4j_bolt clear` | remove all nodes and relationships, needs `--srsly` argument |
126
+ | `neo4j_bolt dump` | dump database contents |
127
+ | `neo4j_bolt load` | load database dump |
128
+ | `neo4j_bolt index ls` | list all database constraints and indexes |
129
+ | `neo4j_bolt index rm` | remove all constraints and indexes, needs `-f` |
130
+ | `neo4j_bolt visualize` | generates a visual representation of the current datbase contents |
131
+
132
+ Specify you Neo4j host and port using `--host` if your database is not running on localhost:7687.
133
+
134
+ ### Dump database contents
135
+
136
+ When you dump a database, output will go to `/dev/stdout` by default, but it can be redirected to any file via `--out-file`. In the export, node IDs start at 0, regardless of the actual node IDs in the database, and start node / end node IDs in the relationship dumps are adjusted accodingly. Don't rely on actual node IDs within your database, as they may change during export and import. Relationship IDs are omitted in the export.
137
+
138
+ ### Load database dump
139
+
140
+ A database dump can only be loaded if the database is empty. Otherwise, you'll have to specify `--force`.
141
+
142
+ ### List constraints and indexes
143
+
144
+ Use the command `neo4j_bolt index ls` to see which constraints and indexes are currently active in the database.
145
+
146
+ ### Remove all constraints and indexes
147
+
148
+ Use the command `neo4j_bolt index rm -f` to remove all constraints and indexes in the database but make sure you know what you're doing.
149
+
150
+ ### Visualize database contents
151
+
152
+ Use the command `neo4j_bolt visualize` to obtain a GraphViz-formatted document suitable for piping into `dot`:
153
+
154
+ ```bash
155
+ ./bin/neo4j_bolt visualize | dot -Tsvg > graph.svg
156
+ ```
157
+
158
+ If you don't have GraphViz installed, you can use a Docker image instead:
159
+
160
+ ```bash
161
+ ./bin/neo4j_bolt visualize | docker run --rm -i nshine/dot dot -Tsvg > graph.svg
162
+ ```
163
+
164
+ The result looks like this for the movie graph example provided by Neo4j:
165
+
166
+ <img src="movie_graph.svg" />
167
+
168
+ You can see nodes and relationships with their current numbers, plus all properties with their respective data types and for each data type the percentage of entities with that data type and min / mean / max values (for ints and floats) or min / mean / max lengths (for strings and lists).
169
+
170
+ Uniqueness constraints and indexes (if available) are shown as well if they are defined on a single node or relationship with a single attribute.
171
+
172
+ If a property is an integer and starts with `ts`, it gets treated as a UNIX timestamp (just for the visualization).
173
+
80
174
  ## Development
81
175
 
82
176
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/bin/console CHANGED
@@ -3,13 +3,6 @@
3
3
  require "bundler/setup"
4
4
  require "neo4j_bolt"
5
5
 
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
6
+ require "pry"
14
7
  include Neo4jBolt
15
- IRB.start(__FILE__)
8
+ Pry.start
data/bin/neo4j_bolt CHANGED
@@ -10,6 +10,8 @@ require "gli"
10
10
 
11
11
  include Neo4jBolt
12
12
 
13
+ ENV['GLI_DEBUG'] = 'true'
14
+
13
15
  class App
14
16
  extend GLI::App
15
17
 
@@ -42,9 +44,9 @@ class App
42
44
  desc 'Dump database'
43
45
  long_desc 'Dump all nodes and relationships.'
44
46
  command :dump do |c|
45
- c.flag [:o, :out_file], :default_value => '/dev/stdout'
47
+ c.flag [:o, 'out-file'.to_sym], :default_value => '/dev/stdout'
46
48
  c.action do |global_options, options|
47
- File.open(options[:out_file], 'w') do |f|
49
+ File.open(options['out-file'.to_sym], 'w') do |f|
48
50
  dump_database(f)
49
51
  end
50
52
  end
@@ -131,7 +133,7 @@ class App
131
133
  long_desc 'Generate a GraphViz-formatted visual representation of the database'
132
134
  command :visualize do |c|
133
135
  c.flag [:o, :out_file], :default_value => '/dev/stdout'
134
- c.switch [:p, :properties], :default_value => false, :desc => 'include properties'
136
+ # c.switch [:p, :properties], :default_value => false, :desc => 'include properties'
135
137
  c.action do |global_options, options|
136
138
  File.open(options[:out_file], 'w') do |f|
137
139
  all_labels = Set.new()
@@ -168,32 +170,30 @@ class App
168
170
 
169
171
  all_labels.to_a.each do |label|
170
172
  properties_for_label[label] ||= {}
171
- if options[:properties]
172
- neo4j_query("MATCH (n:#{label}) RETURN n") do |entry|
173
- counts_for_label[label] ||= 0
174
- counts_for_label[label] += 1
175
- node = entry['n']
176
- node.each_pair do |key, value|
177
- properties_for_label[label][key] ||= {:classes => Set.new(), :counts => {}, :min => {}, :max => {}, :sum => {}}
178
- c = TR[value.class.to_s] || value.class.to_s
179
- properties_for_label[label][key][:classes] << c
180
- properties_for_label[label][key][:counts][c] ||= 0
181
- properties_for_label[label][key][:counts][c] += 1
182
- sz = if c == 'string' || c == 'list'
183
- value.size
184
- elsif c == 'int' || c == 'float'
185
- value
186
- else
187
- nil
188
- end
189
- unless sz.nil?
190
- properties_for_label[label][key][:min][c] ||= sz
191
- properties_for_label[label][key][:min][c] = [properties_for_label[label][key][:min][c], sz].min
192
- properties_for_label[label][key][:max][c] ||= sz
193
- properties_for_label[label][key][:max][c] = [properties_for_label[label][key][:max][c], sz].max
194
- properties_for_label[label][key][:sum][c] ||= 0
195
- properties_for_label[label][key][:sum][c] += sz
196
- end
173
+ neo4j_query("MATCH (n:#{label}) RETURN n") do |entry|
174
+ counts_for_label[label] ||= 0
175
+ counts_for_label[label] += 1
176
+ node = entry['n']
177
+ node.each_pair do |key, value|
178
+ properties_for_label[label][key] ||= {:classes => Set.new(), :counts => {}, :min => {}, :max => {}, :sum => {}}
179
+ c = TR[value.class.to_s] || value.class.to_s
180
+ properties_for_label[label][key][:classes] << c
181
+ properties_for_label[label][key][:counts][c] ||= 0
182
+ properties_for_label[label][key][:counts][c] += 1
183
+ sz = if c == 'string' || c == 'list'
184
+ value.size
185
+ elsif c == 'int' || c == 'float'
186
+ value
187
+ else
188
+ nil
189
+ end
190
+ unless sz.nil?
191
+ properties_for_label[label][key][:min][c] ||= sz
192
+ properties_for_label[label][key][:min][c] = [properties_for_label[label][key][:min][c], sz].min
193
+ properties_for_label[label][key][:max][c] ||= sz
194
+ properties_for_label[label][key][:max][c] = [properties_for_label[label][key][:max][c], sz].max
195
+ properties_for_label[label][key][:sum][c] ||= 0
196
+ properties_for_label[label][key][:sum][c] += sz
197
197
  end
198
198
  end
199
199
  end
@@ -205,32 +205,30 @@ class App
205
205
  la = parts[0]
206
206
  type = parts[1]
207
207
  lb = parts[2]
208
- if options[:properties]
209
- neo4j_query("MATCH (a:#{la})-[r:#{type}]->(b:#{lb}) RETURN r") do |entry|
210
- counts_for_label[s] ||= 0
211
- counts_for_label[s] += 1
212
- rel = entry['r']
213
- rel.each_pair do |key, value|
214
- properties_for_label[s][key] ||= {:classes => Set.new(), :counts => {}, :min => {}, :max => {}, :sum => {}}
215
- c = TR[value.class.to_s] || value.class.to_s
216
- properties_for_label[s][key][:classes] << c
217
- properties_for_label[s][key][:counts][c] ||= 0
218
- properties_for_label[s][key][:counts][c] += 1
219
- sz = if c == 'string' || c == 'list'
220
- value.size
221
- elsif c == 'int' || c == 'float'
222
- value
223
- else
224
- nil
225
- end
226
- unless sz.nil?
227
- properties_for_label[s][key][:min][c] ||= sz
228
- properties_for_label[s][key][:min][c] = [properties_for_label[s][key][:min][c], sz].min
229
- properties_for_label[s][key][:max][c] ||= sz
230
- properties_for_label[s][key][:max][c] = [properties_for_label[s][key][:max][c], sz].max
231
- properties_for_label[s][key][:sum][c] ||= 0
232
- properties_for_label[s][key][:sum][c] += sz
233
- end
208
+ neo4j_query("MATCH (a:#{la})-[r:#{type}]->(b:#{lb}) RETURN r") do |entry|
209
+ counts_for_label[s] ||= 0
210
+ counts_for_label[s] += 1
211
+ rel = entry['r']
212
+ rel.each_pair do |key, value|
213
+ properties_for_label[s][key] ||= {:classes => Set.new(), :counts => {}, :min => {}, :max => {}, :sum => {}}
214
+ c = TR[value.class.to_s] || value.class.to_s
215
+ properties_for_label[s][key][:classes] << c
216
+ properties_for_label[s][key][:counts][c] ||= 0
217
+ properties_for_label[s][key][:counts][c] += 1
218
+ sz = if c == 'string' || c == 'list'
219
+ value.size
220
+ elsif c == 'int' || c == 'float'
221
+ value
222
+ else
223
+ nil
224
+ end
225
+ unless sz.nil?
226
+ properties_for_label[s][key][:min][c] ||= sz
227
+ properties_for_label[s][key][:min][c] = [properties_for_label[s][key][:min][c], sz].min
228
+ properties_for_label[s][key][:max][c] ||= sz
229
+ properties_for_label[s][key][:max][c] = [properties_for_label[s][key][:max][c], sz].max
230
+ properties_for_label[s][key][:sum][c] ||= 0
231
+ properties_for_label[s][key][:sum][c] += sz
234
232
  end
235
233
  end
236
234
  end
@@ -286,15 +284,24 @@ class App
286
284
  mean_s = sprintf('%1.1f', props[lbl][key][:sum][c].to_f / props[lbl][key][:counts][c]).chomp('.0')
287
285
  min_s = (c == 'float') ? sprintf('%1.1f', props[lbl][key][:min][c]) : props[lbl][key][:min][c]
288
286
  max_s = (c == 'float') ? sprintf('%1.1f', props[lbl][key][:max][c]) : props[lbl][key][:max][c]
287
+ if c == 'int' && key[0, 2] == 'ts'
288
+ min_s = Time.at(props[lbl][key][:min][c]).strftime('%Y-%m-%d')
289
+ max_s = Time.at(props[lbl][key][:max][c]).strftime('%Y-%m-%d')
290
+ end
289
291
  if props[lbl][key][:min][c] == props[lbl][key][:max][c]
290
- label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='center' colspan='3'>#{min_s}</td>"
292
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='center' colspan='6'>#{min_s}</td>"
291
293
  else
292
- label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='1'>#{min_s}</td>"
293
- label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='1'>#{mean_s}</td>"
294
- label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='1'>#{max_s}</td>"
294
+ if c == 'int' && key[0, 2] == 'ts'
295
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='3'>#{min_s}</td>"
296
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='3'>#{max_s}</td>"
297
+ else
298
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='2'>#{min_s}</td>"
299
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='2'>#{mean_s}</td>"
300
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='right' colspan='2'>#{max_s}</td>"
301
+ end
295
302
  end
296
303
  else
297
- label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='left' colspan='3'></td>"
304
+ label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='left' colspan='6'></td>"
298
305
  end
299
306
  label += "</tr>"
300
307
  end
@@ -310,10 +317,8 @@ class App
310
317
  io.puts 'splines=true;'
311
318
  properties_for_label.keys.sort.each do |lbl|
312
319
  label = "<<table valign='top' align='left' border='0' cellborder='0' cellspacing='0' cellpadding='4'>"
313
- label += "<tr><td border='1' bgcolor='#fce94f' valign='top' align='left' colspan='6'><b>#{lbl}</b>"
314
- if options[:properties]
315
- label += " <i>(#{counts_for_label[lbl]})</i>"
316
- end
320
+ label += "<tr><td border='1' bgcolor='#fce94f' valign='top' align='left' colspan='9'><b>#{lbl}</b>"
321
+ label += " <i>(#{counts_for_label[lbl]})</i>"
317
322
  label += "</td></tr>"
318
323
  label += print_properties.call(properties_for_label, lbl, false)
319
324
  label += "</table>>"
@@ -326,10 +331,8 @@ class App
326
331
  lb = parts[2]
327
332
 
328
333
  label = "<<table valign='top' align='left' border='0' cellborder='0' cellspacing='0' cellpadding='4'>"
329
- label += "<tr><td border='1' color='#888888' bgcolor='#d3d7cf' valign='top' align='left' colspan='6'>#{type}"
330
- if options[:properties]
331
- label += " <i>(#{counts_for_label[s]})</i>"
332
- end
334
+ label += "<tr><td border='1' color='#888888' bgcolor='#d3d7cf' valign='top' align='left' colspan='9'>#{type}"
335
+ label += " <i>(#{counts_for_label[s]})</i>"
333
336
  label += "</td></tr>"
334
337
  label += print_properties.call(properties_for_label, s, true)
335
338
 
@@ -1,3 +1,3 @@
1
1
  module Neo4jBolt
2
- VERSION = "0.1.15"
2
+ VERSION = "0.1.16"
3
3
  end
data/movie_graph.svg ADDED
@@ -0,0 +1,259 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <!-- Generated by graphviz version 2.40.1 (0)
5
+ -->
6
+ <!-- Title: %3 Pages: 1 -->
7
+ <svg width="796pt" height="328pt"
8
+ viewBox="0.00 0.00 796.00 328.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
9
+ <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 324)">
10
+ <title>%3</title>
11
+ <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-324 792,-324 792,4 -4,4"/>
12
+ <!-- Movie -->
13
+ <g id="node1" class="node">
14
+ <title>Movie</title>
15
+ <polygon fill="#fce94f" stroke="transparent" points="545.5,-167 545.5,-188 788.5,-188 788.5,-167 545.5,-167"/>
16
+ <polygon fill="none" stroke="#000000" points="545.5,-167 545.5,-188 788.5,-188 788.5,-167 545.5,-167"/>
17
+ <text text-anchor="start" x="550.5" y="-176" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#000000">Movie</text>
18
+ <text text-anchor="start" x="583.5" y="-176" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000"> </text>
19
+ <text text-anchor="start" x="587.5" y="-176" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(38)</text>
20
+ <polygon fill="none" stroke="#000000" points="545.5,-146 545.5,-167 598.5,-167 598.5,-146 545.5,-146"/>
21
+ <text text-anchor="start" x="550.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">released</text>
22
+ <polygon fill="none" stroke="#000000" points="598.5,-146 598.5,-167 636.5,-167 636.5,-146 598.5,-146"/>
23
+ <text text-anchor="start" x="603.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">int</text>
24
+ <polygon fill="none" stroke="#000000" points="636.5,-146 636.5,-167 674.5,-167 674.5,-146 636.5,-146"/>
25
+ <text text-anchor="start" x="641.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
26
+ <polygon fill="none" stroke="#000000" points="674.5,-146 674.5,-167 709.5,-167 709.5,-146 674.5,-146"/>
27
+ <text text-anchor="start" x="679.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1975</text>
28
+ <polygon fill="none" stroke="#000000" points="709.5,-146 709.5,-167 753.5,-167 753.5,-146 709.5,-146"/>
29
+ <text text-anchor="start" x="714.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1998.3</text>
30
+ <polygon fill="none" stroke="#000000" points="753.5,-146 753.5,-167 788.5,-167 788.5,-146 753.5,-146"/>
31
+ <text text-anchor="start" x="758.5" y="-154" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">2012</text>
32
+ <polygon fill="none" stroke="#000000" points="545.5,-125 545.5,-146 598.5,-146 598.5,-125 545.5,-125"/>
33
+ <text text-anchor="start" x="550.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">tagline</text>
34
+ <polygon fill="none" stroke="#000000" points="598.5,-125 598.5,-146 636.5,-146 636.5,-125 598.5,-125"/>
35
+ <text text-anchor="start" x="603.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">string</text>
36
+ <polygon fill="none" stroke="#000000" points="636.5,-125 636.5,-146 674.5,-146 674.5,-125 636.5,-125"/>
37
+ <text text-anchor="start" x="647.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">97%</text>
38
+ <polygon fill="none" stroke="#000000" points="674.5,-125 674.5,-146 709.5,-146 709.5,-125 674.5,-125"/>
39
+ <text text-anchor="start" x="691.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">14</text>
40
+ <polygon fill="none" stroke="#000000" points="709.5,-125 709.5,-146 753.5,-146 753.5,-125 709.5,-125"/>
41
+ <text text-anchor="start" x="726.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">48.8</text>
42
+ <polygon fill="none" stroke="#000000" points="753.5,-125 753.5,-146 788.5,-146 788.5,-125 753.5,-125"/>
43
+ <text text-anchor="start" x="764.5" y="-133" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">173</text>
44
+ <polygon fill="none" stroke="#000000" points="545.5,-104 545.5,-125 598.5,-125 598.5,-104 545.5,-104"/>
45
+ <text text-anchor="start" x="550.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">title</text>
46
+ <polygon fill="none" stroke="#000000" points="598.5,-104 598.5,-125 636.5,-125 636.5,-104 598.5,-104"/>
47
+ <text text-anchor="start" x="603.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">string</text>
48
+ <polygon fill="none" stroke="#000000" points="636.5,-104 636.5,-125 674.5,-125 674.5,-104 636.5,-104"/>
49
+ <text text-anchor="start" x="641.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
50
+ <polygon fill="none" stroke="#000000" points="674.5,-104 674.5,-125 709.5,-125 709.5,-104 674.5,-104"/>
51
+ <text text-anchor="start" x="697.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">5</text>
52
+ <polygon fill="none" stroke="#000000" points="709.5,-104 709.5,-125 753.5,-125 753.5,-104 709.5,-104"/>
53
+ <text text-anchor="start" x="726.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">15.3</text>
54
+ <polygon fill="none" stroke="#000000" points="753.5,-104 753.5,-125 788.5,-125 788.5,-104 753.5,-104"/>
55
+ <text text-anchor="start" x="770.5" y="-112" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">31</text>
56
+ </g>
57
+ <!-- Person -->
58
+ <g id="node2" class="node">
59
+ <title>Person</title>
60
+ <polygon fill="#fce94f" stroke="transparent" points="0,-186 0,-207 228,-207 228,-186 0,-186"/>
61
+ <polygon fill="none" stroke="#000000" points="0,-186 0,-207 228,-207 228,-186 0,-186"/>
62
+ <text text-anchor="start" x="5" y="-195" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="10.00" fill="#000000">Person</text>
63
+ <text text-anchor="start" x="44" y="-195" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000"> </text>
64
+ <text text-anchor="start" x="48" y="-195" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(133)</text>
65
+ <polygon fill="none" stroke="#000000" points="0,-165 0,-186 38,-186 38,-165 0,-165"/>
66
+ <text text-anchor="start" x="5" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">born</text>
67
+ <polygon fill="none" stroke="#000000" points="38,-165 38,-186 76,-186 76,-165 38,-165"/>
68
+ <text text-anchor="start" x="43" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">int</text>
69
+ <polygon fill="none" stroke="#000000" points="76,-165 76,-186 114,-186 114,-165 76,-165"/>
70
+ <text text-anchor="start" x="87" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">96%</text>
71
+ <polygon fill="none" stroke="#000000" points="114,-165 114,-186 149,-186 149,-165 114,-165"/>
72
+ <text text-anchor="start" x="119" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1929</text>
73
+ <polygon fill="none" stroke="#000000" points="149,-165 149,-186 193,-186 193,-165 149,-165"/>
74
+ <text text-anchor="start" x="154" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1957.7</text>
75
+ <polygon fill="none" stroke="#000000" points="193,-165 193,-186 228,-186 228,-165 193,-165"/>
76
+ <text text-anchor="start" x="198" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1996</text>
77
+ <polygon fill="none" stroke="#000000" points="0,-144 0,-165 38,-165 38,-144 0,-144"/>
78
+ <text text-anchor="start" x="5" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">name</text>
79
+ <polygon fill="none" stroke="#000000" points="38,-144 38,-165 76,-165 76,-144 38,-144"/>
80
+ <text text-anchor="start" x="43" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">string</text>
81
+ <polygon fill="none" stroke="#000000" points="76,-144 76,-165 114,-165 114,-144 76,-144"/>
82
+ <text text-anchor="start" x="81" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
83
+ <polygon fill="none" stroke="#000000" points="114,-144 114,-165 149,-165 149,-144 114,-144"/>
84
+ <text text-anchor="start" x="137" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">4</text>
85
+ <polygon fill="none" stroke="#000000" points="149,-144 149,-165 193,-165 193,-144 149,-144"/>
86
+ <text text-anchor="start" x="166" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">12.4</text>
87
+ <polygon fill="none" stroke="#000000" points="193,-144 193,-165 228,-165 228,-144 193,-144"/>
88
+ <text text-anchor="start" x="210" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">22</text>
89
+ </g>
90
+ <!-- Person/ACTED_IN/Movie -->
91
+ <g id="node3" class="node">
92
+ <title>Person/ACTED_IN/Movie</title>
93
+ <polygon fill="#d3d7cf" stroke="transparent" points="310.5,-299 310.5,-320 469.5,-320 469.5,-299 310.5,-299"/>
94
+ <polygon fill="none" stroke="#888888" points="310.5,-299 310.5,-320 469.5,-320 469.5,-299 310.5,-299"/>
95
+ <text text-anchor="start" x="315.5" y="-308" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">ACTED_IN </text>
96
+ <text text-anchor="start" x="367.5" y="-308" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(172)</text>
97
+ <polygon fill="none" stroke="#888888" points="310.5,-278 310.5,-299 345.5,-299 345.5,-278 310.5,-278"/>
98
+ <text text-anchor="start" x="315.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">roles</text>
99
+ <polygon fill="none" stroke="#888888" points="345.5,-278 345.5,-299 371.5,-299 371.5,-278 345.5,-278"/>
100
+ <text text-anchor="start" x="350.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">list</text>
101
+ <polygon fill="none" stroke="#888888" points="371.5,-278 371.5,-299 409.5,-299 409.5,-278 371.5,-278"/>
102
+ <text text-anchor="start" x="376.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
103
+ <polygon fill="none" stroke="#888888" points="409.5,-278 409.5,-299 426.5,-299 426.5,-278 409.5,-278"/>
104
+ <text text-anchor="start" x="414.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1</text>
105
+ <polygon fill="none" stroke="#888888" points="426.5,-278 426.5,-299 452.5,-299 452.5,-278 426.5,-278"/>
106
+ <text text-anchor="start" x="431.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">1.1</text>
107
+ <polygon fill="none" stroke="#888888" points="452.5,-278 452.5,-299 469.5,-299 469.5,-278 452.5,-278"/>
108
+ <text text-anchor="start" x="457.5" y="-286" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">6</text>
109
+ </g>
110
+ <!-- Person&#45;&gt;Person/ACTED_IN/Movie -->
111
+ <g id="edge3" class="edge">
112
+ <title>Person&#45;&gt;Person/ACTED_IN/Movie</title>
113
+ <path fill="none" stroke="#000000" d="M161.6088,-207.6008C194.1234,-228.0316 238.8001,-253.9055 281,-271 288.3278,-273.9684 296.0635,-276.7 303.8928,-279.1951"/>
114
+ <polygon fill="#000000" stroke="#000000" points="303.5401,-281.2844 309.8929,-281.0571 304.7849,-277.2731 303.5401,-281.2844"/>
115
+ <text text-anchor="middle" x="254.5" y="-267" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1:1.3</text>
116
+ </g>
117
+ <!-- Person/DIRECTED/Movie -->
118
+ <g id="node4" class="node">
119
+ <title>Person/DIRECTED/Movie</title>
120
+ <polygon fill="#d3d7cf" stroke="transparent" points="344.5,-235 344.5,-256 434.5,-256 434.5,-235 344.5,-235"/>
121
+ <polygon fill="none" stroke="#888888" points="344.5,-235 344.5,-256 434.5,-256 434.5,-235 344.5,-235"/>
122
+ <text text-anchor="start" x="349.5" y="-244" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">DIRECTED </text>
123
+ <text text-anchor="start" x="402.5" y="-244" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(44)</text>
124
+ </g>
125
+ <!-- Person&#45;&gt;Person/DIRECTED/Movie -->
126
+ <g id="edge1" class="edge">
127
+ <title>Person&#45;&gt;Person/DIRECTED/Movie</title>
128
+ <path fill="none" stroke="#000000" d="M228.394,-207.4215C245.984,-212.0803 263.958,-216.7421 281,-221 299.6184,-225.6518 320.1136,-230.4554 338.23,-234.5935"/>
129
+ <polygon fill="#000000" stroke="#000000" points="337.96,-236.6856 344.2765,-235.9701 338.8924,-232.5904 337.96,-236.6856"/>
130
+ <text text-anchor="middle" x="254.5" y="-220" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">3:1</text>
131
+ </g>
132
+ <!-- Person/FOLLOWS/Person -->
133
+ <g id="node5" class="node">
134
+ <title>Person/FOLLOWS/Person</title>
135
+ <polygon fill="#d3d7cf" stroke="transparent" points="349.5,-185 349.5,-206 430.5,-206 430.5,-185 349.5,-185"/>
136
+ <polygon fill="none" stroke="#888888" points="349.5,-185 349.5,-206 430.5,-206 430.5,-185 349.5,-185"/>
137
+ <text text-anchor="start" x="354.5" y="-194" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">FOLLOWS </text>
138
+ <text text-anchor="start" x="404.5" y="-194" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(3)</text>
139
+ </g>
140
+ <!-- Person&#45;&gt;Person/FOLLOWS/Person -->
141
+ <g id="edge9" class="edge">
142
+ <title>Person&#45;&gt;Person/FOLLOWS/Person</title>
143
+ <path fill="none" stroke="#000000" d="M228.0899,-187.1547C231.7687,-187.4498 235.4128,-187.7326 239,-188 273.7133,-190.5877 312.9918,-192.6463 342.7158,-194.027"/>
144
+ <polygon fill="#000000" stroke="#000000" points="342.8185,-196.1338 348.9085,-194.3113 343.0112,-191.9383 342.8185,-196.1338"/>
145
+ <text text-anchor="middle" x="254.5" y="-192" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">44.3:1</text>
146
+ </g>
147
+ <!-- Person/PRODUCED/Movie -->
148
+ <g id="node6" class="node">
149
+ <title>Person/PRODUCED/Movie</title>
150
+ <polygon fill="#d3d7cf" stroke="transparent" points="344.5,-135 344.5,-156 434.5,-156 434.5,-135 344.5,-135"/>
151
+ <polygon fill="none" stroke="#888888" points="344.5,-135 344.5,-156 434.5,-156 434.5,-135 344.5,-135"/>
152
+ <text text-anchor="start" x="349.5" y="-144" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">PRODUCED </text>
153
+ <text text-anchor="start" x="408.5" y="-144" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(15)</text>
154
+ </g>
155
+ <!-- Person&#45;&gt;Person/PRODUCED/Movie -->
156
+ <g id="edge7" class="edge">
157
+ <title>Person&#45;&gt;Person/PRODUCED/Movie</title>
158
+ <path fill="none" stroke="#000000" d="M228.0785,-160.2507C231.7605,-159.8174 235.4084,-159.3991 239,-159 271.9732,-155.336 309.1085,-152.1187 338.2411,-149.8014"/>
159
+ <polygon fill="#000000" stroke="#000000" points="338.5157,-151.8863 344.3319,-149.3207 338.1852,-147.6993 338.5157,-151.8863"/>
160
+ <text text-anchor="middle" x="254.5" y="-162" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">8.9:1</text>
161
+ </g>
162
+ <!-- Person/REVIEWED/Movie -->
163
+ <g id="node7" class="node">
164
+ <title>Person/REVIEWED/Movie</title>
165
+ <polygon fill="#d3d7cf" stroke="transparent" points="281.5,-92 281.5,-113 498.5,-113 498.5,-92 281.5,-92"/>
166
+ <polygon fill="none" stroke="#888888" points="281.5,-92 281.5,-113 498.5,-113 498.5,-92 281.5,-92"/>
167
+ <text text-anchor="start" x="286.5" y="-101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">REVIEWED </text>
168
+ <text text-anchor="start" x="341.5" y="-101" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(9)</text>
169
+ <polygon fill="none" stroke="#888888" points="281.5,-71 281.5,-92 338.5,-92 338.5,-71 281.5,-71"/>
170
+ <text text-anchor="start" x="286.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">rating</text>
171
+ <polygon fill="none" stroke="#888888" points="338.5,-71 338.5,-92 376.5,-92 376.5,-71 338.5,-71"/>
172
+ <text text-anchor="start" x="343.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">int</text>
173
+ <polygon fill="none" stroke="#888888" points="376.5,-71 376.5,-92 414.5,-92 414.5,-71 376.5,-71"/>
174
+ <text text-anchor="start" x="381.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
175
+ <polygon fill="none" stroke="#888888" points="414.5,-71 414.5,-92 437.5,-92 437.5,-71 414.5,-71"/>
176
+ <text text-anchor="start" x="419.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">45</text>
177
+ <polygon fill="none" stroke="#888888" points="437.5,-71 437.5,-92 469.5,-92 469.5,-71 437.5,-71"/>
178
+ <text text-anchor="start" x="442.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">75.2</text>
179
+ <polygon fill="none" stroke="#888888" points="469.5,-71 469.5,-92 498.5,-92 498.5,-71 469.5,-71"/>
180
+ <text text-anchor="start" x="474.5" y="-79" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100</text>
181
+ <polygon fill="none" stroke="#888888" points="281.5,-50 281.5,-71 338.5,-71 338.5,-50 281.5,-50"/>
182
+ <text text-anchor="start" x="286.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">summary</text>
183
+ <polygon fill="none" stroke="#888888" points="338.5,-50 338.5,-71 376.5,-71 376.5,-50 338.5,-50"/>
184
+ <text text-anchor="start" x="343.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">string</text>
185
+ <polygon fill="none" stroke="#888888" points="376.5,-50 376.5,-71 414.5,-71 414.5,-50 376.5,-50"/>
186
+ <text text-anchor="start" x="381.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">100%</text>
187
+ <polygon fill="none" stroke="#888888" points="414.5,-50 414.5,-71 437.5,-71 437.5,-50 414.5,-50"/>
188
+ <text text-anchor="start" x="419.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">12</text>
189
+ <polygon fill="none" stroke="#888888" points="437.5,-50 437.5,-71 469.5,-71 469.5,-50 437.5,-50"/>
190
+ <text text-anchor="start" x="442.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">27.7</text>
191
+ <polygon fill="none" stroke="#888888" points="469.5,-50 469.5,-71 498.5,-71 498.5,-50 469.5,-50"/>
192
+ <text text-anchor="start" x="480.5" y="-58" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">85</text>
193
+ </g>
194
+ <!-- Person&#45;&gt;Person/REVIEWED/Movie -->
195
+ <g id="edge11" class="edge">
196
+ <title>Person&#45;&gt;Person/REVIEWED/Movie</title>
197
+ <path fill="none" stroke="#000000" d="M206.5039,-144.4379C233.6486,-135.1762 263.4302,-125.0147 290.9378,-115.6292"/>
198
+ <polygon fill="#000000" stroke="#000000" points="291.7709,-117.5639 296.7713,-113.6388 290.4146,-113.5889 291.7709,-117.5639"/>
199
+ <text text-anchor="middle" x="254.5" y="-134" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">14.8:1</text>
200
+ </g>
201
+ <!-- Person/WROTE/Movie -->
202
+ <g id="node8" class="node">
203
+ <title>Person/WROTE/Movie</title>
204
+ <polygon fill="#d3d7cf" stroke="transparent" points="353.5,-7 353.5,-28 425.5,-28 425.5,-7 353.5,-7"/>
205
+ <polygon fill="none" stroke="#888888" points="353.5,-7 353.5,-28 425.5,-28 425.5,-7 353.5,-7"/>
206
+ <text text-anchor="start" x="358.5" y="-16" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#000000">WROTE </text>
207
+ <text text-anchor="start" x="398.5" y="-16" font-family="Helvetica,sans-Serif" font-style="italic" font-size="10.00" fill="#000000">(10)</text>
208
+ </g>
209
+ <!-- Person&#45;&gt;Person/WROTE/Movie -->
210
+ <g id="edge5" class="edge">
211
+ <title>Person&#45;&gt;Person/WROTE/Movie</title>
212
+ <path fill="none" stroke="#000000" d="M144.8979,-144.2151C176.3553,-113.7112 227.922,-68.6071 281,-43 301.7582,-32.9853 326.7159,-26.8763 347.4586,-23.2071"/>
213
+ <polygon fill="#000000" stroke="#000000" points="347.9041,-25.2617 353.4699,-22.1905 347.2037,-21.1205 347.9041,-25.2617"/>
214
+ <text text-anchor="middle" x="254.5" y="-70" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">13.3:1</text>
215
+ </g>
216
+ <!-- Person/ACTED_IN/Movie&#45;&gt;Movie -->
217
+ <g id="edge4" class="edge">
218
+ <title>Person/ACTED_IN/Movie&#45;&gt;Movie</title>
219
+ <path fill="none" stroke="#000000" d="M469.2852,-282.2067C479.1641,-279.0292 488.9587,-275.3163 498,-271 540.7649,-250.5839 583.5824,-218.6346 615.3538,-192.1475"/>
220
+ <polygon fill="#000000" stroke="#000000" points="616.7144,-193.7473 619.96,-188.2813 614.0142,-190.5303 616.7144,-193.7473"/>
221
+ <text text-anchor="middle" x="521.5" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">4.5:1</text>
222
+ </g>
223
+ <!-- Person/DIRECTED/Movie&#45;&gt;Movie -->
224
+ <g id="edge2" class="edge">
225
+ <title>Person/DIRECTED/Movie&#45;&gt;Movie</title>
226
+ <path fill="none" stroke="#000000" d="M434.6433,-237.628C454.341,-233.4569 477.5586,-227.8335 498,-221 523.4098,-212.5055 550.2099,-201.5518 574.7769,-190.6538"/>
227
+ <polygon fill="#000000" stroke="#000000" points="575.6883,-192.5468 580.3111,-188.1832 573.9762,-188.7116 575.6883,-192.5468"/>
228
+ <text text-anchor="middle" x="521.5" y="-219" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1.2:1</text>
229
+ </g>
230
+ <!-- Person/FOLLOWS/Person&#45;&gt;Person -->
231
+ <g id="edge10" class="edge">
232
+ <title>Person/FOLLOWS/Person&#45;&gt;Person</title>
233
+ <path fill="none" stroke="#000000" d="M348.8049,-187.0376C325.8027,-182.4288 296.4409,-177.3056 270,-175 258.5118,-173.9982 246.5297,-173.3574 234.5357,-172.9851"/>
234
+ <polygon fill="#000000" stroke="#000000" points="234.3201,-170.8785 228.2651,-172.8144 234.2057,-175.077 234.3201,-170.8785"/>
235
+ <text text-anchor="middle" x="254.5" y="-178" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1:44.3</text>
236
+ </g>
237
+ <!-- Person/PRODUCED/Movie&#45;&gt;Movie -->
238
+ <g id="edge8" class="edge">
239
+ <title>Person/PRODUCED/Movie&#45;&gt;Movie</title>
240
+ <path fill="none" stroke="#000000" d="M434.6213,-146C463.0255,-146 501.2378,-146 538.4398,-146"/>
241
+ <polygon fill="#000000" stroke="#000000" points="538.8841,-148.1001 544.8841,-146 538.8841,-143.9001 538.8841,-148.1001"/>
242
+ <text text-anchor="middle" x="521.5" y="-149" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1:2.5</text>
243
+ </g>
244
+ <!-- Person/REVIEWED/Movie&#45;&gt;Movie -->
245
+ <g id="edge12" class="edge">
246
+ <title>Person/REVIEWED/Movie&#45;&gt;Movie</title>
247
+ <path fill="none" stroke="#000000" d="M498.1827,-107.1108C511.458,-110.178 525.1169,-113.3339 538.6398,-116.4583"/>
248
+ <polygon fill="#000000" stroke="#000000" points="538.5228,-118.5865 544.8416,-117.8912 539.4684,-114.4943 538.5228,-118.5865"/>
249
+ <text text-anchor="middle" x="521.5" y="-117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1:4.2</text>
250
+ </g>
251
+ <!-- Person/WROTE/Movie&#45;&gt;Movie -->
252
+ <g id="edge6" class="edge">
253
+ <title>Person/WROTE/Movie&#45;&gt;Movie</title>
254
+ <path fill="none" stroke="#000000" d="M425.5704,-23.3049C447.1186,-27.2042 474.7343,-33.5027 498,-43 534.6087,-57.9441 572.4301,-80.3275 602.9418,-100.4144"/>
255
+ <polygon fill="#000000" stroke="#000000" points="602.001,-102.3103 608.1622,-103.8756 604.3219,-98.8098 602.001,-102.3103"/>
256
+ <text text-anchor="middle" x="521.5" y="-62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#888888">1:3.8</text>
257
+ </g>
258
+ </g>
259
+ </svg>
data/neo4j_bolt.gemspec CHANGED
@@ -28,4 +28,5 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_development_dependency "rspec", "~> 3.2"
30
30
  spec.add_runtime_dependency "gli"
31
+ spec.add_runtime_dependency "pry"
31
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neo4j_bolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.15
4
+ version: 0.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Specht
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  description:
42
56
  email:
43
57
  - micha.specht@gmail.com
@@ -61,6 +75,7 @@ files:
61
75
  - bin/setup
62
76
  - lib/neo4j_bolt.rb
63
77
  - lib/neo4j_bolt/version.rb
78
+ - movie_graph.svg
64
79
  - neo4j_bolt.gemspec
65
80
  homepage: https://github.com/specht/neo4j_bolt
66
81
  licenses: