neo4j_bolt 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -1
- data/README.md +104 -10
- data/bin/console +2 -9
- data/bin/neo4j_bolt +71 -68
- data/lib/neo4j_bolt/version.rb +1 -1
- data/movie_graph.svg +259 -0
- data/neo4j_bolt.gemspec +1 -0
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ceadde284e1bf7c95b86a4929785fa092369144c66ade7c41c0eb956bf8ffa5b
|
4
|
+
data.tar.gz: 0ca383b2eeff7e0346cf51b1d7d64e86d81fe7019243118b8ab1bb6820ae043a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
59
|
-
- `Neo4jBolt::Relationship
|
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
|
-
|
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
|
-
|
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,
|
47
|
+
c.flag [:o, 'out-file'.to_sym], :default_value => '/dev/stdout'
|
46
48
|
c.action do |global_options, options|
|
47
|
-
File.open(options[
|
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
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
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
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
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='
|
292
|
+
label += "<td border='1' color='#{rel ? '#888888' : '#000000'}' valign='top' align='center' colspan='6'>#{min_s}</td>"
|
291
293
|
else
|
292
|
-
|
293
|
-
|
294
|
-
|
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='
|
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='
|
314
|
-
|
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='
|
330
|
-
|
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
|
|
data/lib/neo4j_bolt/version.rb
CHANGED
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->Person/ACTED_IN/Movie -->
|
111
|
+
<g id="edge3" class="edge">
|
112
|
+
<title>Person->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->Person/DIRECTED/Movie -->
|
126
|
+
<g id="edge1" class="edge">
|
127
|
+
<title>Person->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->Person/FOLLOWS/Person -->
|
141
|
+
<g id="edge9" class="edge">
|
142
|
+
<title>Person->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->Person/PRODUCED/Movie -->
|
156
|
+
<g id="edge7" class="edge">
|
157
|
+
<title>Person->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->Person/REVIEWED/Movie -->
|
195
|
+
<g id="edge11" class="edge">
|
196
|
+
<title>Person->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->Person/WROTE/Movie -->
|
210
|
+
<g id="edge5" class="edge">
|
211
|
+
<title>Person->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->Movie -->
|
217
|
+
<g id="edge4" class="edge">
|
218
|
+
<title>Person/ACTED_IN/Movie->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->Movie -->
|
224
|
+
<g id="edge2" class="edge">
|
225
|
+
<title>Person/DIRECTED/Movie->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->Person -->
|
231
|
+
<g id="edge10" class="edge">
|
232
|
+
<title>Person/FOLLOWS/Person->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->Movie -->
|
238
|
+
<g id="edge8" class="edge">
|
239
|
+
<title>Person/PRODUCED/Movie->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->Movie -->
|
245
|
+
<g id="edge12" class="edge">
|
246
|
+
<title>Person/REVIEWED/Movie->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->Movie -->
|
252
|
+
<g id="edge6" class="edge">
|
253
|
+
<title>Person/WROTE/Movie->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
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.
|
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:
|