neo4j-core 3.0.0.alpha.13 → 3.0.0.alpha.14

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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +60 -49
  3. data/lib/mydb/active_tx_log +1 -0
  4. data/lib/mydb/index/lucene-store.db +0 -0
  5. data/lib/mydb/index/lucene.log.1 +0 -0
  6. data/lib/mydb/index/lucene.log.active +0 -0
  7. data/lib/mydb/lock +0 -0
  8. data/lib/mydb/messages.log +313 -0
  9. data/lib/mydb/neostore +0 -0
  10. data/lib/mydb/neostore.id +0 -0
  11. data/lib/mydb/neostore.labeltokenstore.db +0 -0
  12. data/lib/mydb/neostore.labeltokenstore.db.id +0 -0
  13. data/lib/mydb/neostore.labeltokenstore.db.names +0 -0
  14. data/lib/mydb/neostore.labeltokenstore.db.names.id +0 -0
  15. data/lib/mydb/neostore.nodestore.db +0 -0
  16. data/lib/mydb/neostore.nodestore.db.id +0 -0
  17. data/lib/mydb/neostore.nodestore.db.labels +0 -0
  18. data/lib/mydb/neostore.nodestore.db.labels.id +0 -0
  19. data/lib/mydb/neostore.propertystore.db +0 -0
  20. data/lib/mydb/neostore.propertystore.db.arrays +0 -0
  21. data/lib/mydb/neostore.propertystore.db.arrays.id +0 -0
  22. data/lib/mydb/neostore.propertystore.db.id +0 -0
  23. data/lib/mydb/neostore.propertystore.db.index +0 -0
  24. data/lib/mydb/neostore.propertystore.db.index.id +0 -0
  25. data/lib/mydb/neostore.propertystore.db.index.keys +0 -0
  26. data/lib/mydb/neostore.propertystore.db.index.keys.id +0 -0
  27. data/lib/mydb/neostore.propertystore.db.strings +0 -0
  28. data/lib/mydb/neostore.propertystore.db.strings.id +0 -0
  29. data/lib/mydb/neostore.relationshipstore.db +0 -0
  30. data/lib/mydb/neostore.relationshipstore.db.id +0 -0
  31. data/lib/mydb/neostore.relationshiptypestore.db +0 -0
  32. data/lib/mydb/neostore.relationshiptypestore.db.id +0 -0
  33. data/lib/mydb/neostore.relationshiptypestore.db.names +0 -0
  34. data/lib/mydb/neostore.relationshiptypestore.db.names.id +0 -0
  35. data/lib/mydb/neostore.schemastore.db +0 -0
  36. data/lib/mydb/neostore.schemastore.db.id +0 -0
  37. data/lib/mydb/nioneo_logical.log.1 +0 -0
  38. data/lib/mydb/nioneo_logical.log.active +0 -0
  39. data/lib/mydb/schema/label/lucene/write.lock +0 -0
  40. data/lib/mydb/store_lock +0 -0
  41. data/lib/mydb/tm_tx_log.1 +0 -0
  42. data/lib/neo4j-core.rb +1 -2
  43. data/lib/neo4j-core/query_builder.rb +200 -0
  44. data/lib/neo4j-core/version.rb +1 -1
  45. data/lib/neo4j-embedded.rb +1 -0
  46. data/lib/neo4j-embedded/cypher_response.rb +89 -0
  47. data/lib/neo4j-embedded/cypher_response.rb~ +85 -0
  48. data/lib/neo4j-embedded/embedded_node.rb +12 -0
  49. data/lib/neo4j-embedded/embedded_node.rb~ +201 -0
  50. data/lib/neo4j-embedded/embedded_relationship.rb +8 -0
  51. data/lib/neo4j-embedded/embedded_relationship.rb~ +62 -0
  52. data/lib/neo4j-embedded/embedded_session.rb +20 -12
  53. data/lib/neo4j-embedded/embedded_session.rb~ +145 -0
  54. data/lib/neo4j-server/cypher_relationship.rb +6 -11
  55. data/lib/neo4j-server/cypher_response.rb +43 -5
  56. data/lib/neo4j-server/cypher_response.rb~ +155 -0
  57. data/lib/neo4j-server/cypher_session.rb +54 -19
  58. data/lib/neo4j/label.rb +7 -51
  59. data/lib/neo4j/node.rb +21 -19
  60. data/lib/neo4j/relationship.rb +7 -7
  61. data/lib/neo4j/session.rb +70 -28
  62. data/lib/neo4j/session.rb~ +202 -0
  63. data/neo4j-core.gemspec +0 -1
  64. metadata +49 -16
@@ -8,6 +8,10 @@ module Neo4j::Embedded
8
8
  @match = match
9
9
  end
10
10
 
11
+ def inspect
12
+ "Enumerable<Neo4j::Relationship>"
13
+ end
14
+
11
15
  def each(&block)
12
16
  @node._rels(@match).each {|r| block.call(r.wrapper)}
13
17
  end
@@ -28,6 +32,10 @@ module Neo4j::Embedded
28
32
  @match = match
29
33
  end
30
34
 
35
+ def inspect
36
+ "Enumerable<Neo4j::Node>"
37
+ end
38
+
31
39
  def each(&block)
32
40
  @node._rels(@match).each {|r| block.call(r.other_node(@node))}
33
41
  end
@@ -48,6 +56,10 @@ module Neo4j::Embedded
48
56
  include Neo4j::EntityEquality
49
57
  extend Neo4j::Core::TxMethods
50
58
 
59
+ def inspect
60
+ "EmbeddedNode neo_id: #{neo_id}"
61
+ end
62
+
51
63
  def exist?
52
64
  !!graph_database.get_node_by_id(neo_id)
53
65
  rescue Java::OrgNeo4jGraphdb.NotFoundException
@@ -0,0 +1,201 @@
1
+ module Neo4j::Embedded
2
+ class RelsIterator
3
+ include Enumerable
4
+ extend Neo4j::Core::TxMethods
5
+
6
+ def initialize(node, match)
7
+ @node = node
8
+ @match = match
9
+ end
10
+
11
+ def inspect
12
+ "Enumerable<Neo4j::Relationship>"
13
+ end
14
+
15
+ def each(&block)
16
+ @node._rels(@match).each {|r| block.call(r.wrapper)}
17
+ end
18
+ tx_methods :each
19
+
20
+ def empty?
21
+ first == nil
22
+ end
23
+
24
+ end
25
+
26
+ class NodesIterator
27
+ include Enumerable
28
+ extend Neo4j::Core::TxMethods
29
+
30
+ def initialize(node, match)
31
+ @node = node
32
+ @match = match
33
+ end
34
+
35
+ def each(&block)
36
+ @node._rels(@match).each {|r| block.call(r.other_node(@node))}
37
+ end
38
+ tx_methods :each
39
+
40
+ def empty?
41
+ first == nil
42
+ end
43
+
44
+ end
45
+
46
+ class EmbeddedNode
47
+ class << self
48
+ # This method is used to extend a Java Neo4j class so that it includes the same mixins as this class.
49
+ def extend_java_class(java_clazz)
50
+ java_clazz.class_eval do
51
+ include Neo4j::Embedded::Property
52
+ include Neo4j::EntityEquality
53
+ extend Neo4j::Core::TxMethods
54
+
55
+ def inspect
56
+ "EmbeddedNode neo_id: #{neo_id}"
57
+ end
58
+
59
+ def exist?
60
+ !!graph_database.get_node_by_id(neo_id)
61
+ rescue Java::OrgNeo4jGraphdb.NotFoundException
62
+ nil
63
+ end
64
+ tx_methods :exist?
65
+
66
+ def labels
67
+ _labels.iterator.map{|x| x.name.to_sym}
68
+ end
69
+ tx_methods :labels
70
+
71
+ alias_method :_labels, :getLabels
72
+
73
+ def _java_label(label_name)
74
+ Java::OrgNeo4jGraphdb.DynamicLabel.label(label_name)
75
+ end
76
+
77
+
78
+ def _add_label(*label_name)
79
+ label_name.each do |name|
80
+ addLabel(_java_label(name))
81
+ end
82
+ end
83
+
84
+ alias_method :add_label, :_add_label
85
+ tx_methods :add_label
86
+
87
+ def _remove_label(*label_name)
88
+ label_name.each do |name|
89
+ removeLabel(_java_label(name))
90
+ end
91
+ end
92
+
93
+ alias_method :remove_label, :_remove_label
94
+ tx_methods :remove_label
95
+
96
+ def set_label(*label_names)
97
+ label_as_symbols = label_names.map(&:to_sym)
98
+ to_keep = labels & label_as_symbols
99
+ to_remove = labels - to_keep
100
+ _remove_label(*to_remove)
101
+ to_add = label_as_symbols - to_keep
102
+ _add_label(*to_add)
103
+ end
104
+ tx_methods :set_label
105
+
106
+ def del
107
+ _rels.each { |r| r.del }
108
+ delete
109
+ nil
110
+ end
111
+ tx_methods :del
112
+
113
+ def create_rel(type, other_node, props = nil)
114
+ rel = create_relationship_to(other_node.neo4j_obj, ToJava.type_to_java(type))
115
+ props.each_pair { |k, v| rel[k] = v } if props
116
+ rel
117
+ end
118
+ tx_methods :create_rel
119
+
120
+
121
+ def rels(match={})
122
+ RelsIterator.new(self, match)
123
+ end
124
+
125
+ def nodes(match={})
126
+ NodesIterator.new(self, match)
127
+ end
128
+
129
+ def node(match={})
130
+ rel = _rel(match)
131
+ rel && rel.other_node(self).wrapper
132
+ end
133
+ tx_methods :node
134
+
135
+ def rel?(match={})
136
+ _rels(match).has_next
137
+ end
138
+ tx_methods :rel?
139
+
140
+ def rel(match={})
141
+ _rel(match)
142
+ end
143
+ tx_methods :rel
144
+
145
+ def _rel(match={})
146
+ dir = match[:dir] || :both
147
+ rel_type = match[:type]
148
+
149
+ rel = if rel_type
150
+ get_single_relationship(ToJava.type_to_java(rel_type), ToJava.dir_to_java(dir))
151
+ else
152
+ iter = get_relationships(ToJava.dir_to_java(dir)).iterator
153
+ if (iter.has_next)
154
+ first = iter.next
155
+ raise "Expected to only find one relationship from node #{neo_id} matching #{match.inspect}" if iter.has_next
156
+ first
157
+ end
158
+ end
159
+
160
+ between_id = match[:between] && match[:between].neo_id
161
+
162
+ if (rel && between_id)
163
+ rel.other_node(self).neo_id == between_id ? rel : nil
164
+ else
165
+ rel
166
+ end
167
+ end
168
+
169
+ def _rels(match={})
170
+ dir = match[:dir] || :both
171
+ rel_type = match[:type]
172
+
173
+ rels = if rel_type
174
+ get_relationships(ToJava.type_to_java(rel_type), ToJava.dir_to_java(dir)).iterator
175
+ else
176
+ get_relationships(ToJava.dir_to_java(dir)).iterator
177
+ end
178
+
179
+ between_id = match[:between] && match[:between].neo_id
180
+
181
+ if (between_id)
182
+ rels.find_all{|r| r.end_node.neo_id == between_id || r.start_node.neo_id == between_id}
183
+ else
184
+ rels
185
+ end
186
+
187
+ end
188
+
189
+ def class
190
+ Neo4j::Node
191
+ end
192
+
193
+ include Neo4j::Node::Wrapper
194
+ end
195
+ end
196
+ end
197
+
198
+ extend_java_class(Java::OrgNeo4jKernelImplCore::NodeProxy)
199
+ end
200
+
201
+ end
@@ -18,6 +18,10 @@ module Neo4j::Embedded
18
18
  end
19
19
  tx_methods :exist?
20
20
 
21
+ def inspect
22
+ "EmbeddedRelationship neo_id: #{neo_id}"
23
+ end
24
+
21
25
  def start_node
22
26
  _start_node.wrapper
23
27
  end
@@ -27,6 +31,10 @@ module Neo4j::Embedded
27
31
  getStartNode
28
32
  end
29
33
 
34
+ def rel_type
35
+ getType().name().to_sym
36
+ end
37
+
30
38
  def del
31
39
  delete
32
40
  end
@@ -0,0 +1,62 @@
1
+ module Neo4j::Embedded
2
+ class EmbeddedRelationship
3
+ class << self
4
+ # This method is used to extend a Java Neo4j class so that it includes the same mixins as this class.
5
+ def extend_java_class(java_clazz)
6
+ java_clazz.class_eval do
7
+ include Neo4j::Embedded::Property
8
+ include Neo4j::EntityEquality
9
+ include Neo4j::Relationship::Wrapper
10
+ extend Neo4j::Core::TxMethods
11
+
12
+ alias_method :_other_node, :getOtherNode
13
+
14
+ def exist?
15
+ !!graph_database.get_relationship_by_id(neo_id)
16
+ rescue Java::OrgNeo4jGraphdb.NotFoundException
17
+ nil
18
+ end
19
+ tx_methods :exist?
20
+
21
+ def start_node
22
+ _start_node.wrapper
23
+ end
24
+ tx_methods :start_node
25
+
26
+ def _start_node
27
+ getStartNode
28
+ end
29
+
30
+ def rel_type
31
+ getType().name().to_sym
32
+ end
33
+
34
+ def del
35
+ delete
36
+ end
37
+ tx_methods :del
38
+
39
+ def other_node(n)
40
+ _other_node(n.neo4j_obj).wrapper
41
+ end
42
+ tx_methods :other_node
43
+
44
+ def end_node
45
+ _end_node.wrapper
46
+ end
47
+ tx_methods :end_node
48
+
49
+ def _end_node
50
+ getEndNode
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+
57
+ extend_java_class(Java::OrgNeo4jKernelImplCore::RelationshipProxy)
58
+
59
+ end
60
+
61
+
62
+ end
@@ -21,6 +21,11 @@ module Neo4j::Embedded
21
21
  @db_location = db_location
22
22
  @auto_commit = !!config[:auto_commit]
23
23
  Neo4j::Session.register(self)
24
+ @query_builder = Neo4j::Core::QueryBuilder.new
25
+ end
26
+
27
+ def inspect
28
+ "#{self.class} db_location: '#{@db_location}', running: #{running?}"
24
29
  end
25
30
 
26
31
  def start
@@ -80,15 +85,17 @@ module Neo4j::Embedded
80
85
  nil
81
86
  end
82
87
 
83
- def query(*params, &query_dsl)
84
- begin
85
- result = super
86
- raise CypherError.new(result.error_msg, result.error_code, result.error_status) if result.respond_to?(:error?) && result.error?
87
- # TODO ugly, the server database must convert the result
88
- result.respond_to?(:to_hash_enumeration) ? result.to_hash_enumeration : result.to_a
89
- rescue Exception => e
90
- raise CypherError.new(e,nil,nil)
88
+ def query(*params)
89
+ query_hash = @query_builder.to_query_hash(params, :to_node)
90
+ cypher = @query_builder.to_cypher(query_hash)
91
+
92
+ result = _query(cypher, query_hash[:params])
93
+ if result.respond_to?(:error?) && result.error?
94
+ raise Neo4j::Session::CypherError.new(result.error_msg, result.error_code, result.error_status)
91
95
  end
96
+
97
+ map_return_procs = @query_builder.to_map_return_procs(query_hash)
98
+ ResultWrapper.new(result, map_return_procs, cypher)
92
99
  end
93
100
 
94
101
  def find_all_nodes(label)
@@ -105,12 +112,13 @@ module Neo4j::Embedded
105
112
  # @return (see #query)
106
113
  def _query(q, params={})
107
114
  engine = Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
108
- result = engine.execute(q, Neo4j::Core::HashWithIndifferentAccess.new(params))
109
- Neo4j::Cypher::ResultWrapper.new(result)
115
+ engine.execute(q, Neo4j::Core::HashWithIndifferentAccess.new(params))
116
+ rescue Exception => e
117
+ raise Neo4j::Session::CypherError.new(e.message, e.class, 'cypher error')
110
118
  end
111
119
 
112
- def query_default_return
113
- " RETURN n"
120
+ def query_default_return(as)
121
+ " RETURN #{as}"
114
122
  end
115
123
 
116
124
  def _query_or_fail(q)
@@ -0,0 +1,145 @@
1
+ # Plugin
2
+
3
+ Neo4j::Session.register_db(:embedded_db) do |*args|
4
+ Neo4j::Embedded::EmbeddedSession.new(*args)
5
+ end
6
+
7
+
8
+ module Neo4j::Embedded
9
+ class EmbeddedSession < Neo4j::Session
10
+
11
+ class Error < StandardError
12
+ end
13
+
14
+ attr_reader :graph_db, :db_location
15
+ extend Forwardable
16
+ extend Neo4j::Core::TxMethods
17
+ def_delegator :@graph_db, :begin_tx
18
+
19
+
20
+ def initialize(db_location, config={})
21
+ @db_location = db_location
22
+ @auto_commit = !!config[:auto_commit]
23
+ Neo4j::Session.register(self)
24
+ @query_builder = Neo4j::Core::QueryBuilder.new
25
+ end
26
+
27
+ def start
28
+ raise Error.new("Embedded Neo4j db is already running") if running?
29
+ puts "Start embedded Neo4j db at #{db_location}"
30
+ factory = Java::OrgNeo4jGraphdbFactory::GraphDatabaseFactory.new
31
+ @graph_db = factory.newEmbeddedDatabase(db_location)
32
+ Neo4j::Session._notify_listeners(:session_available, self)
33
+ end
34
+
35
+ def factory_class
36
+ Java::OrgNeo4jGraphdbFactory::GraphDatabaseFactory
37
+ Java::OrgNeo4jTest::ImpermanentGraphDatabase
38
+ end
39
+
40
+ def close
41
+ super
42
+ shutdown
43
+ end
44
+
45
+ def shutdown
46
+ graph_db && graph_db.shutdown
47
+ @graph_db = nil
48
+ end
49
+
50
+ def running?
51
+ !!graph_db
52
+ end
53
+
54
+ def create_label(name)
55
+ EmbeddedLabel.new(self, name)
56
+ end
57
+
58
+ def load_node(neo_id)
59
+ _load_node(neo_id)
60
+ end
61
+ tx_methods :load_node
62
+
63
+ # Same as load but does not return the node as a wrapped Ruby object.
64
+ #
65
+ def _load_node(neo_id)
66
+ return nil if neo_id.nil?
67
+ @graph_db.get_node_by_id(neo_id.to_i)
68
+ rescue Java::OrgNeo4jGraphdb.NotFoundException
69
+ nil
70
+ end
71
+
72
+ def load_relationship(neo_id)
73
+ _load_relationship(neo_id)
74
+ end
75
+ tx_methods :load_relationship
76
+
77
+ def _load_relationship(neo_id)
78
+ return nil if neo_id.nil?
79
+ @graph_db.get_relationship_by_id(neo_id.to_i)
80
+ rescue Java::OrgNeo4jGraphdb.NotFoundException
81
+ nil
82
+ end
83
+
84
+ def query(*params)
85
+ query_hash = @query_builder.to_query_hash(params, :to_node)
86
+ cypher = @query_builder.to_cypher(query_hash)
87
+
88
+ result = _query(cypher, query_hash[:params])
89
+ if result.respond_to?(:error?) && result.error?
90
+ raise Neo4j::Session::CypherError.new(result.error_msg, result.error_code, result.error_status)
91
+ end
92
+
93
+ map_return_procs = @query_builder.to_map_return_procs(query_hash)
94
+ ResultWrapper.new(result, map_return_procs, cypher)
95
+ end
96
+
97
+ def find_all_nodes(label)
98
+ EmbeddedLabel.new(self, label).find_nodes
99
+ end
100
+
101
+ def find_nodes(label, key, value)
102
+ EmbeddedLabel.new(self, label).find_nodes(key,value)
103
+ end
104
+
105
+ # Performs a cypher query with given string.
106
+ # Remember that you should close the resource iterator.
107
+ # @param [String] q the cypher query as a String
108
+ # @return (see #query)
109
+ def _query(q, params={})
110
+ engine = Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
111
+ engine.execute(q, Neo4j::Core::HashWithIndifferentAccess.new(params))
112
+ rescue Exception => e
113
+ raise Neo4j::Session::CypherError.new(e.message, e.class, 'cypher error')
114
+ end
115
+
116
+ def query_default_return(as)
117
+ " RETURN #{as}"
118
+ end
119
+
120
+ def _query_or_fail(q)
121
+ engine = Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
122
+ engine.execute(q)
123
+ end
124
+
125
+ def search_result_to_enumerable(result)
126
+ result.map {|column| column['n'].wrapper}
127
+ end
128
+
129
+ def create_node(properties = nil, labels=[])
130
+ if labels.empty?
131
+ _java_node = graph_db.create_node
132
+ else
133
+ labels = EmbeddedLabel.as_java(labels)
134
+ _java_node = graph_db.create_node(labels)
135
+ end
136
+ properties.each_pair { |k, v| _java_node[k]=v } if properties
137
+ _java_node
138
+ end
139
+ tx_methods :create_node
140
+
141
+ end
142
+
143
+
144
+
145
+ end