neo4j 1.0.0.beta.8 → 1.0.0.beta.9
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.
- data/lib/neo4j/database.rb +1 -1
- data/lib/neo4j/event_handler.rb +17 -5
- data/lib/neo4j/index.rb +41 -7
- data/lib/neo4j/load.rb +17 -0
- data/lib/neo4j/mapping/class_methods/init_node.rb +50 -0
- data/lib/neo4j/mapping/class_methods/init_rel.rb +35 -0
- data/lib/neo4j/mapping/class_methods/property.rb +1 -56
- data/lib/neo4j/mapping/class_methods/rule.rb +1 -1
- data/lib/neo4j/mapping/has_n.rb +8 -9
- data/lib/neo4j/mapping/node_mixin.rb +7 -3
- data/lib/neo4j/mapping/relationship_mixin.rb +117 -0
- data/lib/neo4j/node.rb +11 -19
- data/lib/neo4j/node_traverser.rb +1 -1
- data/lib/neo4j/relationship.rb +51 -8
- data/lib/neo4j/relationship_mixin.rb +4 -0
- data/lib/neo4j/relationship_traverser.rb +1 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j.rb +5 -0
- metadata +8 -3
data/lib/neo4j/database.rb
CHANGED
data/lib/neo4j/event_handler.rb
CHANGED
@@ -21,8 +21,9 @@ module Neo4j
|
|
21
21
|
data.removed_node_properties.each { |tx_data| property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless data.deleted_nodes.include?(tx_data.entity) }
|
22
22
|
data.deleted_nodes.each { |node| node_deleted(node, deleted_properties_for(node,data))}
|
23
23
|
data.created_relationships.each {|rel| relationship_created(rel)}
|
24
|
-
data.deleted_relationships.each {|rel| relationship_deleted(rel)}
|
25
|
-
|
24
|
+
data.deleted_relationships.each {|rel| relationship_deleted(rel, deleted_rel_properties_for(rel, data))}
|
25
|
+
data.assigned_relationship_properties.each { |tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, tx_data.value) }
|
26
|
+
data.removed_relationship_properties.each {|tx_data| rel_property_changed(tx_data.entity, tx_data.key, tx_data.previously_commited_value, nil) unless data.deleted_relationships.include?(tx_data.entity) }
|
26
27
|
end
|
27
28
|
|
28
29
|
def deleted_properties_for(node, data)
|
@@ -32,6 +33,13 @@ module Neo4j
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
36
|
+
def deleted_rel_properties_for(rel, data)
|
37
|
+
data.removed_relationship_properties.find_all{|tx_data| tx_data.entity == rel}.inject({}) do |memo, tx_data|
|
38
|
+
memo[tx_data.key] = tx_data.previously_commited_value
|
39
|
+
memo
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
35
43
|
def add(listener)
|
36
44
|
@listeners << listener unless @listeners.include?(listener)
|
37
45
|
end
|
@@ -69,15 +77,19 @@ module Neo4j
|
|
69
77
|
@listeners.each {|li| li.on_relationship_created(relationship) if li.respond_to?(:on_relationship_created)}
|
70
78
|
end
|
71
79
|
|
72
|
-
def relationship_deleted(relationship)
|
73
|
-
@listeners.each {|li| li.on_relationship_deleted(relationship) if li.respond_to?(:on_relationship_deleted)}
|
80
|
+
def relationship_deleted(relationship, old_props)
|
81
|
+
@listeners.each {|li| li.on_relationship_deleted(relationship, old_props) if li.respond_to?(:on_relationship_deleted)}
|
74
82
|
end
|
75
83
|
|
76
84
|
def property_changed(node, key, old_value, new_value)
|
77
85
|
@listeners.each {|li| li.on_property_changed(node, key, old_value, new_value) if li.respond_to?(:on_property_changed)}
|
78
86
|
end
|
79
87
|
|
80
|
-
|
88
|
+
def rel_property_changed(rel, key, old_value, new_value)
|
89
|
+
@listeners.each {|li| li.on_rel_property_changed(rel, key, old_value, new_value) if li.respond_to?(:on_rel_property_changed)}
|
90
|
+
end
|
91
|
+
|
92
|
+
# TODO ?
|
81
93
|
def tx_finished(tx)
|
82
94
|
@listeners.each {|li| li.on_tx_finished(tx) if li.respond_to?(:on_tx_finished)}
|
83
95
|
end
|
data/lib/neo4j/index.rb
CHANGED
@@ -14,9 +14,20 @@ module Neo4j
|
|
14
14
|
|
15
15
|
def_delegators :@indexer, :index, :find, :index?, :index_type?, :clear_index_type, :rm_index_type, :add_index, :rm_index, :index_type_for, :index_name
|
16
16
|
|
17
|
-
|
17
|
+
|
18
|
+
# Sets which indexer should be used for the given node class
|
19
|
+
# Returns the old one if there was an old indexer.
|
20
|
+
def node_indexer(clazz)
|
21
|
+
indexer(clazz, :node)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Sets which indexer should be used for the given relationship class
|
18
25
|
# Returns the old one if there was an old indexer.
|
19
|
-
def
|
26
|
+
def rel_indexer(clazz)
|
27
|
+
indexer(clazz, :rel)
|
28
|
+
end
|
29
|
+
|
30
|
+
def indexer(clazz, type) #:nodoc:
|
20
31
|
old = @indexer
|
21
32
|
@@indexers ||= {}
|
22
33
|
if @@indexers.include?(clazz)
|
@@ -24,7 +35,7 @@ module Neo4j
|
|
24
35
|
@indexer = @@indexers[clazz]
|
25
36
|
@indexer.include_trigger(self)
|
26
37
|
else
|
27
|
-
@indexer = Indexer.new(clazz)
|
38
|
+
@indexer = Indexer.new(clazz, type)
|
28
39
|
@@indexers[clazz] = @indexer
|
29
40
|
end
|
30
41
|
old
|
@@ -84,9 +95,12 @@ module Neo4j
|
|
84
95
|
class Indexer
|
85
96
|
attr_reader :index_name
|
86
97
|
|
87
|
-
def initialize(clazz)
|
98
|
+
def initialize(clazz, type)
|
88
99
|
@index_name = clazz.to_s
|
89
100
|
|
101
|
+
# do we want to index nodes or relationships ?
|
102
|
+
@type = type
|
103
|
+
|
90
104
|
@indexes = {} # key = type, value = java neo4j index
|
91
105
|
@field_types = {} # key = field, value = type (e.g. :exact or :fulltext)
|
92
106
|
@triggered_by = clazz.to_s
|
@@ -174,7 +188,11 @@ module Neo4j
|
|
174
188
|
def create_index_with(type)
|
175
189
|
db=Neo4j.started_db
|
176
190
|
index_config = lucene_config(type)
|
177
|
-
|
191
|
+
if @type == :node
|
192
|
+
db.lucene.node_index("#{@index_name}-#{type}", index_config)
|
193
|
+
else
|
194
|
+
db.lucene.relationship_index("#{@index_name}-#{type}", index_config)
|
195
|
+
end
|
178
196
|
end
|
179
197
|
|
180
198
|
|
@@ -186,7 +204,7 @@ module Neo4j
|
|
186
204
|
end
|
187
205
|
|
188
206
|
def trigger?(classname)
|
189
|
-
@triggered_by.include?(classname || 'Neo4j::Node')
|
207
|
+
@triggered_by.include?(classname || (@type==:node ? 'Neo4j::Node' : 'Neo4j::Relationship'))
|
190
208
|
end
|
191
209
|
|
192
210
|
def on_node_created(node)
|
@@ -195,7 +213,7 @@ module Neo4j
|
|
195
213
|
end
|
196
214
|
|
197
215
|
def on_node_deleted(node, old_props)
|
198
|
-
return unless
|
216
|
+
return unless trigger?(old_props['_classname'])
|
199
217
|
@field_types.keys.each {|field| rm_index(node, field, old_props[field]) if old_props[field]}
|
200
218
|
end
|
201
219
|
|
@@ -207,6 +225,22 @@ module Neo4j
|
|
207
225
|
# add index
|
208
226
|
add_index(node, field, new_val) if new_val
|
209
227
|
end
|
228
|
+
|
229
|
+
def on_rel_property_changed(rel, field, old_val, new_val)
|
230
|
+
# works exactly like for nodes
|
231
|
+
on_property_changed(rel, field, old_val, new_val)
|
232
|
+
end
|
233
|
+
|
234
|
+
def on_relationship_created(rel)
|
235
|
+
# works exactly like for nodes
|
236
|
+
on_node_created(rel)
|
237
|
+
end
|
238
|
+
|
239
|
+
def on_relationship_deleted(rel, old_props)
|
240
|
+
# works exactly like for nodes
|
241
|
+
on_node_deleted(rel, old_props)
|
242
|
+
end
|
243
|
+
|
210
244
|
end
|
211
245
|
|
212
246
|
end
|
data/lib/neo4j/load.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module Load
|
3
|
+
def wrapper(node)
|
4
|
+
return node unless node.property?(:_classname)
|
5
|
+
to_class(node[:_classname]).load_wrapper(node)
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_class(class_name)
|
9
|
+
class_name.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def exist?(node_or_node_id, db = Neo4j.started_db)
|
13
|
+
id = node_or_node_id.kind_of?(Fixnum) ? node_or_node_id : node_or_node_id.id
|
14
|
+
load(id, db) != nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Neo4j::Mapping
|
2
|
+
module ClassMethods
|
3
|
+
module InitNode
|
4
|
+
|
5
|
+
def load_wrapper(node)
|
6
|
+
wrapped_node = self.orig_new
|
7
|
+
wrapped_node.init_on_load(node)
|
8
|
+
wrapped_node
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
# Creates a new node or loads an already existing Neo4j node.
|
13
|
+
#
|
14
|
+
# You can use two callback method to initialize the node
|
15
|
+
# init_on_load:: this method is called when the node is loaded from the database
|
16
|
+
# init_on_create:: called when the node is created, will be provided with the same argument as the new method
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# Does
|
20
|
+
# * sets the neo4j property '_classname' to self.class.to_s
|
21
|
+
# * creates a neo4j node java object (in @_java_node)
|
22
|
+
#
|
23
|
+
# If you want to provide your own initialize method you should instead implement the
|
24
|
+
# method init_on_create method.
|
25
|
+
#
|
26
|
+
# === Example
|
27
|
+
#
|
28
|
+
# class MyNode
|
29
|
+
# include Neo4j::NodeMixin
|
30
|
+
#
|
31
|
+
# def init_on_create(name, age)
|
32
|
+
# self[:name] = name
|
33
|
+
# self[:age] = age
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# node = MyNode.new('jimmy', 23)
|
38
|
+
#
|
39
|
+
def new(*args)
|
40
|
+
node = Neo4j::Node.create
|
41
|
+
wrapped_node = super()
|
42
|
+
wrapped_node.init_on_load(node)
|
43
|
+
wrapped_node.init_on_create(*args)
|
44
|
+
wrapped_node
|
45
|
+
end
|
46
|
+
|
47
|
+
alias_method :create, :new
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Neo4j::Mapping
|
2
|
+
module ClassMethods
|
3
|
+
module InitRel
|
4
|
+
def load_wrapper(rel)
|
5
|
+
wrapped_rel = self.orig_new
|
6
|
+
wrapped_rel.init_on_load(rel)
|
7
|
+
wrapped_rel
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
# Creates a relationship between given nodes.
|
12
|
+
#
|
13
|
+
# You can use two callback method to initialize the relationship
|
14
|
+
# init_on_load:: this method is called when the relationship is loaded from the database
|
15
|
+
# init_on_create:: called when the relationship is created, will be provided with the same argument as the new method
|
16
|
+
#
|
17
|
+
# ==== Parameters (when creating a new relationship in db)
|
18
|
+
# type:: the key and value to be set
|
19
|
+
# from_node:: create relationship from this node
|
20
|
+
# to_node:: create relationship to this node
|
21
|
+
# props:: optional hash of properties to initialize the create relationship with
|
22
|
+
#
|
23
|
+
def new(*args)
|
24
|
+
type, from_node, to_node, props = args
|
25
|
+
rel = Neo4j::Relationship.create(type, from_node, to_node)
|
26
|
+
wrapped_rel = super()
|
27
|
+
wrapped_rel.init_on_load(rel)
|
28
|
+
wrapped_rel.init_on_create(*args)
|
29
|
+
wrapped_rel
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :create, :new
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -61,61 +61,6 @@ module Neo4j::Mapping
|
|
61
61
|
_decl_props[prop_name.to_sym][:defined] == true
|
62
62
|
end
|
63
63
|
|
64
|
-
|
65
|
-
def load
|
66
|
-
# TODO
|
67
|
-
node = db.graph.get_node_by_id(node_id.to_i)
|
68
|
-
clazz = Neo4j::Node.to_class(node[:_classname])
|
69
|
-
raise "Expected classname #{self} got #{clazz}" if clazz != self
|
70
|
-
end
|
71
|
-
|
72
|
-
def load_wrapper(node, db = Neo4j.started_db)
|
73
|
-
wrapped_node = self.orig_new # avo
|
74
|
-
#id creating a new node, only a Ruby Object
|
75
|
-
wrapped_node.init_on_load(node)
|
76
|
-
wrapped_node
|
77
|
-
end
|
78
|
-
|
79
|
-
|
80
|
-
# Creates a new node or loads an already existing Neo4j node.
|
81
|
-
#
|
82
|
-
# Does
|
83
|
-
# * sets the neo4j property '_classname' to self.class.to_s
|
84
|
-
# * creates a neo4j node java object (in @_java_node)
|
85
|
-
# * calls init_node if that is defined in the current class.
|
86
|
-
#
|
87
|
-
# If you want to provide your own initialize method you should instead implement the
|
88
|
-
# method init_node method.
|
89
|
-
#
|
90
|
-
# === Example
|
91
|
-
#
|
92
|
-
# class MyNode
|
93
|
-
# include Neo4j::NodeMixin
|
94
|
-
#
|
95
|
-
# def init_node(name, age)
|
96
|
-
# self[:name] = name
|
97
|
-
# self[:age] = age
|
98
|
-
# end
|
99
|
-
# end
|
100
|
-
#
|
101
|
-
# node = MyNode.new('jimmy', 23)
|
102
|
-
# # notice the following is still possible:
|
103
|
-
# node = MyNode :name => 'jimmy', :age => 12
|
104
|
-
#
|
105
|
-
# The init_node is only called when the node is created in the database.
|
106
|
-
# The initialize method is used both for to purposes:
|
107
|
-
# loading an already existing node from the Neo4j database and creating a new node in the database.
|
108
|
-
#
|
109
|
-
def new(*args)
|
110
|
-
node = Neo4j::Node.create
|
111
|
-
wrapped_node = super()
|
112
|
-
wrapped_node.init_on_load(node)
|
113
|
-
wrapped_node.init_on_create(*args)
|
114
|
-
wrapped_node
|
115
|
-
end
|
116
|
-
|
117
|
-
alias_method :create, :new
|
118
|
-
|
119
64
|
end
|
120
65
|
end
|
121
|
-
end
|
66
|
+
end
|
data/lib/neo4j/mapping/has_n.rb
CHANGED
@@ -6,6 +6,7 @@ module Neo4j
|
|
6
6
|
#
|
7
7
|
class HasN
|
8
8
|
include Enumerable
|
9
|
+
include ToJava
|
9
10
|
|
10
11
|
def initialize(node, dsl) # :nodoc:
|
11
12
|
@node = node
|
@@ -64,6 +65,7 @@ module Neo4j
|
|
64
65
|
|
65
66
|
|
66
67
|
# Creates a relationship instance between this and the other node.
|
68
|
+
# Returns the relationship object
|
67
69
|
def new(other)
|
68
70
|
create_rel(@node, other)
|
69
71
|
end
|
@@ -79,11 +81,6 @@ module Neo4j
|
|
79
81
|
#
|
80
82
|
# n1 << n2 << n3
|
81
83
|
#
|
82
|
-
# This is the same as:
|
83
|
-
#
|
84
|
-
# n1.add_rel(:friends, n2)
|
85
|
-
# n1.add_rel(:friends, n3)
|
86
|
-
#
|
87
84
|
# ==== Returns
|
88
85
|
# self
|
89
86
|
#
|
@@ -101,14 +98,16 @@ module Neo4j
|
|
101
98
|
from, to = other, node
|
102
99
|
end
|
103
100
|
|
104
|
-
|
105
|
-
|
101
|
+
java_type = type_to_java(@dsl.namespace_type)
|
102
|
+
rel = from._java_node.create_relationship_to(to._java_node, java_type)
|
103
|
+
rel[:_classname] = @dsl.relationship_class.to_s if @dsl.relationship_class
|
106
104
|
|
105
|
+
# TODO - not implemented yet
|
107
106
|
# the from.neo_id is only used for cascade_delete_incoming since that node will be deleted when all the list items has been deleted.
|
108
107
|
# if cascade_delete_outgoing all nodes will be deleted when the root node is deleted
|
109
108
|
# if cascade_delete_incoming then the root node will be deleted when all root nodes' outgoing nodes are deleted
|
110
|
-
rel[@dsl.cascade_delete_prop_name] = node.neo_id if @dsl.cascade_delete?
|
111
|
-
rel
|
109
|
+
#rel[@dsl.cascade_delete_prop_name] = node.neo_id if @dsl.cascade_delete?
|
110
|
+
rel.wrapper
|
112
111
|
end
|
113
112
|
|
114
113
|
end
|
@@ -26,7 +26,7 @@ module Neo4j::Mapping
|
|
26
26
|
def init_on_create(*args) # :nodoc:
|
27
27
|
self[:_classname] = self.class.to_s
|
28
28
|
if args[0].respond_to?(:each_pair)
|
29
|
-
|
29
|
+
args[0].each_pair { |k, v| @_java_node.set_property(k.to_s, v) }
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -46,17 +46,21 @@ module Neo4j::Mapping
|
|
46
46
|
alias_method :orig_new, :new
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
49
50
|
c.extend ClassMethods::Root
|
50
51
|
c.extend ClassMethods::Property
|
52
|
+
c.extend ClassMethods::InitNode
|
51
53
|
c.extend ClassMethods::Relationship
|
52
54
|
c.extend ClassMethods::Rule
|
53
55
|
c.extend Neo4j::Index::ClassMethods
|
56
|
+
|
54
57
|
def c.inherited(subclass)
|
55
|
-
subclass.
|
58
|
+
subclass.node_indexer subclass
|
56
59
|
subclass.root_class subclass
|
57
60
|
super
|
58
61
|
end
|
59
|
-
|
62
|
+
|
63
|
+
c.node_indexer c
|
60
64
|
c.root_class c
|
61
65
|
end
|
62
66
|
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module Neo4j::Mapping
|
2
|
+
|
3
|
+
module RelationshipMixin
|
4
|
+
extend Forwardable
|
5
|
+
include Neo4j::Index
|
6
|
+
|
7
|
+
def_delegators :@_java_rel, :[]=, :[], :property?, :props, :attributes, :update, :neo_id, :id, :to_param, :getId,
|
8
|
+
:equal?, :eql?, :==, :delete, :getStartNode, :getEndNode, :getOtherNode
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
# --------------------------------------------------------------------------
|
13
|
+
# Initialization methods
|
14
|
+
#
|
15
|
+
|
16
|
+
|
17
|
+
# Init this node with the specified java neo4j relationship.
|
18
|
+
#
|
19
|
+
def init_on_load(java_rel) # :nodoc:
|
20
|
+
@_java_rel = java_rel
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# Creates a new node and initialize with given properties.
|
25
|
+
#
|
26
|
+
def init_on_create(*args) # :nodoc:
|
27
|
+
type, from_node, to_node, props = args
|
28
|
+
self[:_classname] = self.class.to_s
|
29
|
+
if props.respond_to?(:each_pair)
|
30
|
+
props.each_pair { |k, v| @_java_rel.set_property(k.to_s, v) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# --------------------------------------------------------------------------
|
36
|
+
# Instance Methods
|
37
|
+
#
|
38
|
+
|
39
|
+
# Returns the org.neo4j.graphdb.Relationship wrapped object
|
40
|
+
def _java_rel
|
41
|
+
@_java_rel
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the end node of this relationship
|
45
|
+
def end_node
|
46
|
+
id = getEndNode.getId
|
47
|
+
Neo4j::Node.load(id)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the start node of this relationship
|
51
|
+
def start_node
|
52
|
+
id = getStartNode.getId
|
53
|
+
Neo4j::Node.load(id)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Deletes this relationship
|
57
|
+
def del
|
58
|
+
delete
|
59
|
+
end
|
60
|
+
|
61
|
+
def exist?
|
62
|
+
Neo4j::Relationship.load(neo_id) != nil
|
63
|
+
end
|
64
|
+
|
65
|
+
# A convenience operation that, given a node that is attached to this relationship, returns the other node.
|
66
|
+
# For example if node is a start node, the end node will be returned, and vice versa.
|
67
|
+
# This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels operations on node.
|
68
|
+
#
|
69
|
+
# This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
|
70
|
+
#
|
71
|
+
# ==== Example
|
72
|
+
# For example, to get the node "at the other end" of a relationship, use the following:
|
73
|
+
# Node endNode = node.rel(:some_rel_type).other_node(node)
|
74
|
+
#
|
75
|
+
def other_node(node)
|
76
|
+
neo_node = node.respond_to?(:_java_node)? node._java_node : node
|
77
|
+
id = getOtherNode(neo_node).getId
|
78
|
+
Neo4j::Node.load(id)
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
# Returns the neo relationship type that this relationship is used in.
|
83
|
+
# (see java API org.neo4j.graphdb.Relationship#getType and org.neo4j.graphdb.RelationshipType)
|
84
|
+
#
|
85
|
+
# ==== Returns
|
86
|
+
# the relationship type (of type Symbol)
|
87
|
+
#
|
88
|
+
def relationship_type
|
89
|
+
get_type.name.to_sym
|
90
|
+
end
|
91
|
+
|
92
|
+
# --------------------------------------------------------------------------
|
93
|
+
# Class Methods
|
94
|
+
#
|
95
|
+
|
96
|
+
class << self
|
97
|
+
def included(c) # :nodoc:
|
98
|
+
c.instance_eval do
|
99
|
+
class << self
|
100
|
+
alias_method :orig_new, :new
|
101
|
+
end
|
102
|
+
end
|
103
|
+
c.extend ClassMethods::Root
|
104
|
+
c.extend ClassMethods::Property
|
105
|
+
c.extend ClassMethods::InitRel
|
106
|
+
c.extend Neo4j::Index::ClassMethods
|
107
|
+
|
108
|
+
def c.inherited(subclass)
|
109
|
+
subclass.rel_indexer subclass
|
110
|
+
super
|
111
|
+
end
|
112
|
+
|
113
|
+
c.rel_indexer c
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/neo4j/node.rb
CHANGED
@@ -19,16 +19,21 @@ module Neo4j
|
|
19
19
|
Neo4j::Node.exist?(self)
|
20
20
|
end
|
21
21
|
|
22
|
-
#
|
22
|
+
# same as _java_node
|
23
|
+
# Used so that we have same method for both relationship and nodes
|
23
24
|
def wrapped_entity
|
24
25
|
self
|
25
26
|
end
|
26
27
|
|
27
28
|
# Loads the Ruby wrapper for this node
|
28
29
|
# If there is no _classname property for this node then it will simply return itself.
|
29
|
-
# Same as Neo4j::Node.
|
30
|
+
# Same as Neo4j::Node.wrapper(node)
|
30
31
|
def wrapper
|
31
|
-
self.class.
|
32
|
+
self.class.wrapper(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def _java_node
|
36
|
+
self
|
32
37
|
end
|
33
38
|
|
34
39
|
def class
|
@@ -40,10 +45,10 @@ module Neo4j
|
|
40
45
|
class Node
|
41
46
|
extend Neo4j::Index::ClassMethods
|
42
47
|
|
43
|
-
self.
|
48
|
+
self.node_indexer self
|
44
49
|
|
45
50
|
class << self
|
46
|
-
|
51
|
+
include Neo4j::Load
|
47
52
|
|
48
53
|
# Creates a new node using the default db instance when given no args
|
49
54
|
# Same as Neo4j::Node#create
|
@@ -63,26 +68,13 @@ module Neo4j
|
|
63
68
|
alias_method :create, :new
|
64
69
|
|
65
70
|
def load(node_id, db = Neo4j.started_db)
|
66
|
-
|
71
|
+
wrapper(db.graph.get_node_by_id(node_id.to_i))
|
67
72
|
rescue java.lang.IllegalStateException
|
68
73
|
nil # the node has been deleted
|
69
74
|
rescue org.neo4j.graphdb.NotFoundException
|
70
75
|
nil
|
71
76
|
end
|
72
77
|
|
73
|
-
def load_wrapper(node)
|
74
|
-
return node unless node.property?(:_classname)
|
75
|
-
to_class(node[:_classname]).load_wrapper(node)
|
76
|
-
end
|
77
|
-
|
78
|
-
def to_class(class_name)
|
79
|
-
class_name.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
80
|
-
end
|
81
|
-
|
82
|
-
def exist?(node_or_node_id, db = Neo4j.started_db)
|
83
|
-
id = node_or_node_id.kind_of?(Fixnum) ? node_or_node_id : node_or_node_id.id
|
84
|
-
load(id, db) != nil
|
85
|
-
end
|
86
78
|
|
87
79
|
end
|
88
80
|
end
|
data/lib/neo4j/node_traverser.rb
CHANGED
data/lib/neo4j/relationship.rb
CHANGED
@@ -9,18 +9,40 @@ module Neo4j
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def end_node # :nodoc:
|
12
|
-
|
12
|
+
getEndNode.wrapper
|
13
13
|
end
|
14
14
|
|
15
15
|
def start_node # :nodoc:
|
16
|
-
|
16
|
+
getStartNode.wrapper
|
17
17
|
end
|
18
18
|
|
19
19
|
def other_node(node) # :nodoc:
|
20
|
-
|
21
|
-
other_node = getOtherNode(java_node)
|
22
|
-
Neo4j::Node.load_wrapper(other_node)
|
20
|
+
getOtherNode(node._java_node).wrapper
|
23
21
|
end
|
22
|
+
|
23
|
+
|
24
|
+
# same as _java_rel
|
25
|
+
# Used so that we have same method for both relationship and nodes
|
26
|
+
def wrapped_entity
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def _java_rel
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Loads the Ruby wrapper for this node
|
35
|
+
# If there is no _classname property for this node then it will simply return itself.
|
36
|
+
# Same as Neo4j::Node.load_wrapper(node)
|
37
|
+
def wrapper
|
38
|
+
self.class.wrapper(self)
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def class
|
43
|
+
Neo4j::Relationship
|
44
|
+
end
|
45
|
+
|
24
46
|
end
|
25
47
|
|
26
48
|
#
|
@@ -57,7 +79,15 @@ module Neo4j
|
|
57
79
|
# (Those mixin are actually not included in the Neo4j::Relationship but instead directly included in the java class org.neo4j.kernel.impl.core.RelationshipProxy)
|
58
80
|
#
|
59
81
|
class Relationship
|
82
|
+
extend Neo4j::Index::ClassMethods
|
83
|
+
|
84
|
+
self.rel_indexer self
|
85
|
+
|
60
86
|
class << self
|
87
|
+
include Neo4j::Load
|
88
|
+
include Neo4j::ToJava
|
89
|
+
|
90
|
+
|
61
91
|
# Returns a org.neo4j.graphdb.Relationship java object (!)
|
62
92
|
# Will trigger a event that the relationship was created.
|
63
93
|
#
|
@@ -74,11 +104,24 @@ module Neo4j
|
|
74
104
|
#
|
75
105
|
# Neo4j::Relationship.new :friend, node1, node2, :since => '2001-01-02', :status => 'okey'
|
76
106
|
#
|
77
|
-
def new(type, from_node, to_node, props=
|
78
|
-
|
79
|
-
|
107
|
+
def new(type, from_node, to_node, props=nil)
|
108
|
+
java_type = type_to_java(type)
|
109
|
+
rel = from_node._java_node.create_relationship_to(to_node._java_node, java_type)
|
110
|
+
props.each_pair {|k,v| rel[k] = v} if props
|
80
111
|
rel
|
81
112
|
end
|
113
|
+
|
114
|
+
# create is the same as new
|
115
|
+
alias_method :create, :new
|
116
|
+
|
117
|
+
def load(rel_id, db = Neo4j.started_db)
|
118
|
+
wrapper(db.graph.get_relationship_by_id(rel_id.to_i))
|
119
|
+
rescue java.lang.IllegalStateException
|
120
|
+
nil # the node has been deleted
|
121
|
+
rescue org.neo4j.graphdb.NotFoundException
|
122
|
+
nil
|
123
|
+
end
|
124
|
+
|
82
125
|
end
|
83
126
|
|
84
127
|
end
|
data/lib/neo4j/version.rb
CHANGED
data/lib/neo4j.rb
CHANGED
@@ -20,10 +20,13 @@ require 'neo4j/node_traverser'
|
|
20
20
|
require 'neo4j/property'
|
21
21
|
require 'neo4j/transaction'
|
22
22
|
require 'neo4j/node_relationship'
|
23
|
+
require 'neo4j/load'
|
23
24
|
require 'neo4j/relationship'
|
24
25
|
require 'neo4j/node'
|
25
26
|
require 'neo4j/config'
|
26
27
|
require 'neo4j/neo4j'
|
28
|
+
require 'neo4j/mapping/class_methods/init_node'
|
29
|
+
require 'neo4j/mapping/class_methods/init_rel'
|
27
30
|
require 'neo4j/mapping/class_methods/root'
|
28
31
|
require 'neo4j/mapping/class_methods/property'
|
29
32
|
require 'neo4j/mapping/class_methods/index'
|
@@ -31,7 +34,9 @@ require 'neo4j/mapping/class_methods/relationship'
|
|
31
34
|
require 'neo4j/mapping/decl_relationship_dsl'
|
32
35
|
require 'neo4j/mapping/has_n'
|
33
36
|
require 'neo4j/mapping/node_mixin'
|
37
|
+
require 'neo4j/mapping/relationship_mixin'
|
34
38
|
require 'neo4j/node_mixin'
|
39
|
+
require 'neo4j/relationship_mixin'
|
35
40
|
require 'neo4j/mapping/class_methods/rule'
|
36
41
|
|
37
42
|
# rails
|
metadata
CHANGED
@@ -7,8 +7,8 @@ version: !ruby/object:Gem::Version
|
|
7
7
|
- 0
|
8
8
|
- 0
|
9
9
|
- beta
|
10
|
-
-
|
11
|
-
version: 1.0.0.beta.
|
10
|
+
- 9
|
11
|
+
version: 1.0.0.beta.9
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Andreas Ronge
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-10-
|
19
|
+
date: 2010-10-05 00:00:00 +02:00
|
20
20
|
default_executable:
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -166,6 +166,8 @@ files:
|
|
166
166
|
- lib/neo4j/node.rb
|
167
167
|
- lib/neo4j/node_mixin.rb
|
168
168
|
- lib/neo4j/property.rb
|
169
|
+
- lib/neo4j/relationship_mixin.rb
|
170
|
+
- lib/neo4j/load.rb
|
169
171
|
- lib/neo4j/database.rb
|
170
172
|
- lib/neo4j/index.rb
|
171
173
|
- lib/neo4j/version.rb
|
@@ -186,10 +188,13 @@ files:
|
|
186
188
|
- lib/neo4j/mapping/decl_relationship_dsl.rb
|
187
189
|
- lib/neo4j/mapping/node_mixin.rb
|
188
190
|
- lib/neo4j/mapping/has_n.rb
|
191
|
+
- lib/neo4j/mapping/relationship_mixin.rb
|
189
192
|
- lib/neo4j/mapping/class_methods/rule.rb
|
193
|
+
- lib/neo4j/mapping/class_methods/init_node.rb
|
190
194
|
- lib/neo4j/mapping/class_methods/property.rb
|
191
195
|
- lib/neo4j/mapping/class_methods/index.rb
|
192
196
|
- lib/neo4j/mapping/class_methods/root.rb
|
197
|
+
- lib/neo4j/mapping/class_methods/init_rel.rb
|
193
198
|
- lib/neo4j/mapping/class_methods/relationship.rb
|
194
199
|
- README.rdoc
|
195
200
|
- CHANGELOG
|