neo4j 1.0.0.beta.20 → 3.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +243 -0
- data/CONTRIBUTORS +12 -0
- data/Gemfile +10 -11
- data/README.md +23 -0
- data/bin/neo4j-jars +33 -0
- data/config/locales/en.yml +5 -0
- data/config/neo4j/config.yml +98 -0
- data/lib/neo4j.rb +28 -68
- data/lib/neo4j/active_node.rb +60 -0
- data/lib/neo4j/active_node/callbacks.rb +41 -0
- data/lib/neo4j/active_node/has_n.rb +138 -0
- data/lib/neo4j/active_node/has_n/decl_rel.rb +236 -0
- data/lib/neo4j/active_node/has_n/nodes.rb +82 -0
- data/lib/neo4j/active_node/identity.rb +28 -0
- data/lib/neo4j/active_node/initialize.rb +24 -0
- data/lib/neo4j/active_node/labels.rb +142 -0
- data/lib/neo4j/active_node/persistence.rb +193 -0
- data/lib/neo4j/active_node/property.rb +41 -0
- data/lib/neo4j/active_node/rels.rb +11 -0
- data/lib/neo4j/active_node/validations.rb +51 -0
- data/lib/neo4j/railtie.rb +40 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j/wrapper.rb +25 -0
- data/neo4j.gemspec +25 -15
- metadata +136 -149
- data/README.rdoc +0 -135
- data/lib/generators/neo4j.rb +0 -65
- data/lib/generators/neo4j/model/model_generator.rb +0 -39
- data/lib/generators/neo4j/model/templates/model.erb +0 -7
- data/lib/neo4j/config.rb +0 -153
- data/lib/neo4j/database.rb +0 -56
- data/lib/neo4j/equal.rb +0 -21
- data/lib/neo4j/event_handler.rb +0 -116
- data/lib/neo4j/index/class_methods.rb +0 -62
- data/lib/neo4j/index/index.rb +0 -33
- data/lib/neo4j/index/indexer.rb +0 -312
- data/lib/neo4j/index/indexer_registry.rb +0 -68
- data/lib/neo4j/index/lucene_query.rb +0 -191
- data/lib/neo4j/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j/jars/lucene-core-3.0.2.jar +0 -0
- data/lib/neo4j/jars/neo4j-index-1.2-1.2.M03.jar +0 -0
- data/lib/neo4j/jars/neo4j-kernel-1.2-1.2.M03.jar +0 -0
- data/lib/neo4j/jars/neo4j-lucene-index-0.2-1.2.M03.jar +0 -0
- data/lib/neo4j/load.rb +0 -21
- data/lib/neo4j/mapping/class_methods/init_node.rb +0 -50
- data/lib/neo4j/mapping/class_methods/init_rel.rb +0 -35
- data/lib/neo4j/mapping/class_methods/property.rb +0 -80
- data/lib/neo4j/mapping/class_methods/relationship.rb +0 -90
- data/lib/neo4j/mapping/class_methods/root.rb +0 -31
- data/lib/neo4j/mapping/class_methods/rule.rb +0 -295
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +0 -214
- data/lib/neo4j/mapping/has_n.rb +0 -83
- data/lib/neo4j/mapping/node_mixin.rb +0 -97
- data/lib/neo4j/mapping/relationship_mixin.rb +0 -117
- data/lib/neo4j/model.rb +0 -4
- data/lib/neo4j/neo4j.rb +0 -95
- data/lib/neo4j/node.rb +0 -131
- data/lib/neo4j/node_mixin.rb +0 -4
- data/lib/neo4j/node_relationship.rb +0 -149
- data/lib/neo4j/node_traverser.rb +0 -157
- data/lib/neo4j/property.rb +0 -111
- data/lib/neo4j/rails/finders.rb +0 -121
- data/lib/neo4j/rails/lucene_connection_closer.rb +0 -19
- data/lib/neo4j/rails/mapping/property.rb +0 -35
- data/lib/neo4j/rails/model.rb +0 -324
- data/lib/neo4j/rails/railtie.rb +0 -16
- data/lib/neo4j/rails/transaction.rb +0 -67
- data/lib/neo4j/rails/tx_methods.rb +0 -15
- data/lib/neo4j/rails/validations/non_nil.rb +0 -11
- data/lib/neo4j/rails/validations/uniqueness.rb +0 -31
- data/lib/neo4j/rails/value.rb +0 -124
- data/lib/neo4j/rails/value_properties.rb +0 -29
- data/lib/neo4j/relationship.rb +0 -169
- data/lib/neo4j/relationship_mixin.rb +0 -4
- data/lib/neo4j/relationship_traverser.rb +0 -92
- data/lib/neo4j/to_java.rb +0 -31
- data/lib/neo4j/transaction.rb +0 -68
- data/lib/neo4j/type_converters.rb +0 -98
@@ -1,68 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Index
|
3
|
-
class IndexerRegistry #:nodoc:
|
4
|
-
class << self
|
5
|
-
|
6
|
-
def delete_all_indexes
|
7
|
-
@@indexers.values.each {|i| i.delete_index_type}
|
8
|
-
end
|
9
|
-
|
10
|
-
def create_for(this_clazz, using_other_clazz, type)
|
11
|
-
@@indexers ||= {}
|
12
|
-
index = Indexer.new(this_clazz, type)
|
13
|
-
index.inherit_fields_from(@@indexers[using_other_clazz.to_s])
|
14
|
-
@@indexers[this_clazz.to_s] = index
|
15
|
-
end
|
16
|
-
|
17
|
-
def find_by_class(classname)
|
18
|
-
@@indexers[classname]
|
19
|
-
end
|
20
|
-
|
21
|
-
def on_node_deleted(node, old_props, tx_data)
|
22
|
-
indexer = find_by_class(old_props['_classname'] || node.class.to_s)
|
23
|
-
indexer && indexer.remove_index_on_fields(node, old_props, tx_data)
|
24
|
-
end
|
25
|
-
|
26
|
-
def on_property_changed(node, field, old_val, new_val)
|
27
|
-
classname = node['_classname'] || node.class.to_s
|
28
|
-
indexer = find_by_class(classname)
|
29
|
-
indexer && indexer.update_index_on(node, field, old_val, new_val)
|
30
|
-
end
|
31
|
-
|
32
|
-
def on_rel_property_changed(rel, field, old_val, new_val)
|
33
|
-
# works exactly like for nodes
|
34
|
-
on_property_changed(rel, field, old_val, new_val)
|
35
|
-
end
|
36
|
-
|
37
|
-
def on_relationship_created(rel, tx_data)
|
38
|
-
end_node = rel._end_node
|
39
|
-
# if end_node was created in this transaction then it will be handled in on_property_changed
|
40
|
-
created = tx_data.created_nodes.find{|n| n.neo_id == end_node.neo_id}
|
41
|
-
unless created
|
42
|
-
indexer = find_by_class(end_node['_classname'])
|
43
|
-
indexer && indexer.update_on_new_relationship(rel)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def on_relationship_deleted(rel, old_props, tx_data)
|
48
|
-
on_node_deleted(rel, old_props, tx_data)
|
49
|
-
# if only the relationship has been deleted then we have to remove the index
|
50
|
-
# if both the relationship and the node has been deleted then the index will be removed in the
|
51
|
-
# on_node_deleted callback
|
52
|
-
end_node = rel._end_node
|
53
|
-
deleted = tx_data.deleted_nodes.find{|n| n.neo_id == end_node.neo_id}
|
54
|
-
unless deleted
|
55
|
-
indexer = find_by_class(end_node['_classname'])
|
56
|
-
indexer && indexer.update_on_deleted_relationship(rel)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def on_neo4j_shutdown(*)
|
61
|
-
@@indexers.each_value {|indexer| indexer.on_neo4j_shutdown}
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
Neo4j.unstarted_db.event_handler.add(IndexerRegistry)
|
66
|
-
|
67
|
-
end
|
68
|
-
end
|
@@ -1,191 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Index
|
3
|
-
# == LuceneQuery
|
4
|
-
#
|
5
|
-
# This object is returned when you call the #find method on the Node, Relationship.
|
6
|
-
# The actual query is not executed until the first item is requested.
|
7
|
-
#
|
8
|
-
# You can perform a query in many different ways:
|
9
|
-
#
|
10
|
-
# ==== By Hash
|
11
|
-
#
|
12
|
-
# Example:
|
13
|
-
# Person.find(:name => 'foo', :age => 3)
|
14
|
-
#
|
15
|
-
# ==== By Range
|
16
|
-
#
|
17
|
-
# Example:
|
18
|
-
# Person.find(:age).between(15,35)
|
19
|
-
#
|
20
|
-
# ==== By Lucene Query Syntax
|
21
|
-
#
|
22
|
-
# Example
|
23
|
-
# Car.find('wheels:"4" AND colour: "blue")
|
24
|
-
#
|
25
|
-
# For more information about the syntax see http://lucene.apache.org/java/3_0_2/queryparsersyntax.html
|
26
|
-
#
|
27
|
-
# ==== By Compound Queries
|
28
|
-
#
|
29
|
-
# You can combine several queries by <tt>AND</tt>ing those together.
|
30
|
-
#
|
31
|
-
# Example:
|
32
|
-
# Vehicle.find(:weight).between(5.0, 100000.0).and(:name).between('a', 'd')
|
33
|
-
#
|
34
|
-
# === See Also
|
35
|
-
# * Neo4j::Index::Indexer#index
|
36
|
-
# * Neo4j::Index::Indexer#find - which returns an LuceneQuery
|
37
|
-
#
|
38
|
-
class LuceneQuery
|
39
|
-
include Enumerable
|
40
|
-
attr_accessor :left_and_query, :left_or_query
|
41
|
-
|
42
|
-
def initialize(index, decl_props, query)
|
43
|
-
@index = index
|
44
|
-
@query = query
|
45
|
-
@decl_props = decl_props
|
46
|
-
end
|
47
|
-
|
48
|
-
# Since we include the Ruby Enumerable mixin we need this method.
|
49
|
-
def each
|
50
|
-
hits.each { |n| yield n.wrapper }
|
51
|
-
end
|
52
|
-
|
53
|
-
# Close hits
|
54
|
-
#
|
55
|
-
# Closes the underlying search result. This method should be called whenever you've got what you wanted from the result and won't use it anymore.
|
56
|
-
# It's necessary to call it so that underlying indexes can dispose of allocated resources for this search result.
|
57
|
-
# You can however skip to call this method if you loop through the whole result, then close() will be called automatically.
|
58
|
-
# Even if you loop through the entire result and then call this method it will silently ignore any consequtive call (for convenience).
|
59
|
-
#
|
60
|
-
# This must be done according to the Neo4j Java Documentation:
|
61
|
-
def close
|
62
|
-
@hits.close if @hits
|
63
|
-
end
|
64
|
-
|
65
|
-
# True if there is no search hits.
|
66
|
-
def empty?
|
67
|
-
hits.size == 0
|
68
|
-
end
|
69
|
-
|
70
|
-
# returns the n'th search item
|
71
|
-
# Does simply loop all search items till the n'th is found.
|
72
|
-
#
|
73
|
-
def [](index)
|
74
|
-
each_with_index {|node,i| break node if index == i}
|
75
|
-
end
|
76
|
-
|
77
|
-
# Returns the number of search hits
|
78
|
-
def size
|
79
|
-
hits.size
|
80
|
-
end
|
81
|
-
|
82
|
-
def hits #:nodoc:
|
83
|
-
@hits ||= perform_query
|
84
|
-
end
|
85
|
-
|
86
|
-
# Performs a range query
|
87
|
-
# Notice that if you don't specify a type when declaring a property a String range query will be performed.
|
88
|
-
#
|
89
|
-
def between(lower, upper, lower_incusive=false, upper_inclusive=false)
|
90
|
-
raise "Expected a symbol. Syntax for range queries example: index(:weight).between(a,b)" unless Symbol === @query
|
91
|
-
raise "Can't only do range queries on Neo4j::NodeMixin, Neo4j::Model, Neo4j::RelationshipMixin" unless @decl_props
|
92
|
-
# check that we perform a range query on the same values as we have declared with the property :key, :type => ...
|
93
|
-
type = @decl_props[@query] && @decl_props[@query][:type]
|
94
|
-
raise "find(#{@query}).between(#{lower}, #{upper}): #{lower} not a #{type}" if type && !type === lower.class
|
95
|
-
raise "find(#{@query}).between(#{lower}, #{upper}): #{upper} not a #{type}" if type && !type === upper.class
|
96
|
-
|
97
|
-
# Make it possible to convert those values
|
98
|
-
lower = TypeConverters.convert(lower)
|
99
|
-
upper = TypeConverters.convert(upper)
|
100
|
-
|
101
|
-
@query = case lower
|
102
|
-
when Fixnum
|
103
|
-
org.apache.lucene.search.NumericRangeQuery.new_long_range(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
104
|
-
when Float
|
105
|
-
org.apache.lucene.search.NumericRangeQuery.new_double_range(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
106
|
-
else
|
107
|
-
org.apache.lucene.search.TermRangeQuery.new(@query.to_s, lower, upper, lower_incusive, upper_inclusive)
|
108
|
-
end
|
109
|
-
self
|
110
|
-
end
|
111
|
-
|
112
|
-
# Create a compound lucene query.
|
113
|
-
#
|
114
|
-
# ==== Parameters
|
115
|
-
# query2 :: the query that should be AND together
|
116
|
-
#
|
117
|
-
# ==== Example
|
118
|
-
#
|
119
|
-
# Person.find(:name=>'kalle').and(:age => 3)
|
120
|
-
#
|
121
|
-
def and(query2)
|
122
|
-
new_query = LuceneQuery.new(@index, @decl_props, query2)
|
123
|
-
new_query.left_and_query = self
|
124
|
-
new_query
|
125
|
-
end
|
126
|
-
|
127
|
-
|
128
|
-
# Sort descending the given fields.
|
129
|
-
def desc(*fields)
|
130
|
-
@order = fields.inject(@order || {}) { |memo, field| memo[field] = true; memo }
|
131
|
-
self
|
132
|
-
end
|
133
|
-
|
134
|
-
# Sort ascending the given fields.
|
135
|
-
def asc(*fields)
|
136
|
-
@order = fields.inject(@order || {}) { |memo, field| memo[field] = false; memo }
|
137
|
-
self
|
138
|
-
end
|
139
|
-
|
140
|
-
def build_and_query(query) #:nodoc:
|
141
|
-
left_query = @left_and_query.build_query
|
142
|
-
and_query = org.apache.lucene.search.BooleanQuery.new
|
143
|
-
and_query.add(left_query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
144
|
-
and_query.add(query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
145
|
-
and_query
|
146
|
-
end
|
147
|
-
|
148
|
-
def build_sort_query(query) #:nodoc:
|
149
|
-
java_sort_fields = @order.keys.inject([]) do |memo, field|
|
150
|
-
decl_type = @decl_props && @decl_props[field] && @decl_props[field][:type]
|
151
|
-
type = case
|
152
|
-
when Float == decl_type
|
153
|
-
org.apache.lucene.search.SortField::DOUBLE
|
154
|
-
when Fixnum == decl_type
|
155
|
-
org.apache.lucene.search.SortField::LONG
|
156
|
-
else
|
157
|
-
org.apache.lucene.search.SortField::STRING
|
158
|
-
end
|
159
|
-
memo << org.apache.lucene.search.SortField.new(field.to_s, type, @order[field])
|
160
|
-
end
|
161
|
-
sort = org.apache.lucene.search.Sort.new(*java_sort_fields)
|
162
|
-
org.neo4j.index.impl.lucene.QueryContext.new(query).sort(sort)
|
163
|
-
end
|
164
|
-
|
165
|
-
def build_hash_query(query) #:nodoc:
|
166
|
-
and_query = org.apache.lucene.search.BooleanQuery.new
|
167
|
-
|
168
|
-
query.each_pair do |key, value|
|
169
|
-
raise "Only String values valid in find(hash) got :#{key} => #{value} which is not a String" if !value.is_a?(String) && @decl_props[key] && @decl_props[key][:type] != String
|
170
|
-
term = org.apache.lucene.index.Term.new(key.to_s, value.to_s)
|
171
|
-
term_query = org.apache.lucene.search.TermQuery.new(term)
|
172
|
-
and_query.add(term_query, org.apache.lucene.search.BooleanClause::Occur::MUST)
|
173
|
-
end
|
174
|
-
and_query
|
175
|
-
end
|
176
|
-
|
177
|
-
def build_query #:nodoc:
|
178
|
-
query = @query
|
179
|
-
query = build_hash_query(query) if Hash === query
|
180
|
-
query = build_and_query(query) if @left_and_query
|
181
|
-
query = build_sort_query(query) if @order
|
182
|
-
query
|
183
|
-
end
|
184
|
-
|
185
|
-
def perform_query #:nodoc:
|
186
|
-
@index.query(build_query)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/lib/neo4j/load.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
# === Mixin responsible for loading Ruby wrappers for Neo4j Nodes and Relationship.
|
4
|
-
#
|
5
|
-
module Load
|
6
|
-
def wrapper(node) # :nodoc:
|
7
|
-
return node unless node.property?(:_classname)
|
8
|
-
to_class(node[:_classname]).load_wrapper(node)
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_class(class_name) # :nodoc:
|
12
|
-
class_name.split("::").inject(Kernel) {|container, name| container.const_get(name.to_s) }
|
13
|
-
end
|
14
|
-
|
15
|
-
# Checks if the given entity (node/relationship) or entity id (#neo_id) exists in the database.
|
16
|
-
def exist?(node_or_node_id, db = Neo4j.started_db)
|
17
|
-
id = node_or_node_id.kind_of?(Fixnum) ? node_or_node_id : node_or_node_id.id
|
18
|
-
_load(id, db) != nil
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,50 +0,0 @@
|
|
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
|
@@ -1,35 +0,0 @@
|
|
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
|
@@ -1,80 +0,0 @@
|
|
1
|
-
module Neo4j::Mapping
|
2
|
-
module ClassMethods
|
3
|
-
module Property
|
4
|
-
|
5
|
-
# Generates accessor method and sets configuration for Neo4j node properties.
|
6
|
-
# The generated accessor is a simple wrapper around the #[] and
|
7
|
-
# #[]= operators.
|
8
|
-
#
|
9
|
-
# ==== Types
|
10
|
-
# If a property is set to nil the property will be removed.
|
11
|
-
# A property can be of any primitive type (Boolean, String, Fixnum, Float) and does not
|
12
|
-
# even have to be the same.
|
13
|
-
#
|
14
|
-
# Example:
|
15
|
-
# class Foo
|
16
|
-
# include Neo4j::NodeMixin
|
17
|
-
# property :age
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# Example:
|
21
|
-
# foo = Foo.new
|
22
|
-
# foo.age = "hej" # first set it to string
|
23
|
-
# foo.age = 42 # change it to a Fixnum
|
24
|
-
#
|
25
|
-
# However, you can specify an type for the index, see Neo4j::Index::Indexer#index
|
26
|
-
#
|
27
|
-
# ==== Example
|
28
|
-
# class Baaz; end
|
29
|
-
#
|
30
|
-
# class Foo
|
31
|
-
# include Neo4j::NodeMixin
|
32
|
-
# property :name, :city # can set several properties in one go
|
33
|
-
# property :bar
|
34
|
-
# end
|
35
|
-
#
|
36
|
-
# f = Foo.new
|
37
|
-
# f.bar = Baaz.new
|
38
|
-
#
|
39
|
-
def property(*props)
|
40
|
-
if props.size == 2 and props[1].kind_of?(Hash)
|
41
|
-
props[1].each_pair do |key, value|
|
42
|
-
pname = props[0].to_sym
|
43
|
-
_decl_props[pname] ||= {}
|
44
|
-
_decl_props[pname][key] = value
|
45
|
-
end
|
46
|
-
props = props[0..0]
|
47
|
-
end
|
48
|
-
|
49
|
-
props.each do |prop|
|
50
|
-
pname = prop.to_sym
|
51
|
-
_decl_props[pname] ||= {}
|
52
|
-
|
53
|
-
define_method(pname) do
|
54
|
-
Neo4j::TypeConverters.to_ruby(self.class, pname, self[pname])
|
55
|
-
end
|
56
|
-
|
57
|
-
name = (pname.to_s() +"=").to_sym
|
58
|
-
define_method(name) do |value|
|
59
|
-
self[pname] = Neo4j::TypeConverters.to_java(self.class, pname, value)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
# Returns true if the given property name has been defined with the class
|
66
|
-
# method property or properties.
|
67
|
-
#
|
68
|
-
# Notice that the node may have properties that has not been declared.
|
69
|
-
# It is always possible to set an undeclared property on a node.
|
70
|
-
#
|
71
|
-
# ==== Returns
|
72
|
-
# true or false
|
73
|
-
#
|
74
|
-
def property?(prop_name)
|
75
|
-
return false if _decl_props[prop_name.to_sym].nil?
|
76
|
-
_decl_props[prop_name.to_sym][:defined] == true
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|