neo4j 3.0.0.alpha.7 → 3.0.0.alpha.8
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/CHANGELOG +9 -0
- data/lib/neo4j.rb +3 -0
- data/lib/neo4j/active_node.rb +1 -0
- data/lib/neo4j/active_node/has_n.rb +6 -6
- data/lib/neo4j/active_node/has_n/decl_rel.rb +22 -2
- data/lib/neo4j/active_node/has_n/nodes.rb +1 -2
- data/lib/neo4j/active_node/labels.rb +35 -74
- data/lib/neo4j/active_node/orm_adapter.rb +8 -13
- data/lib/neo4j/active_node/persistence.rb +9 -6
- data/lib/neo4j/active_node/property.rb +24 -4
- data/lib/neo4j/active_node/query.rb +54 -0
- data/lib/neo4j/active_node/query/query_proxy.rb +107 -0
- data/lib/neo4j/active_node/quick_query.rb +254 -0
- data/lib/neo4j/active_node/validations.rb +1 -1
- data/lib/neo4j/version.rb +1 -1
- data/neo4j.gemspec +1 -1
- metadata +7 -48
- data/lib/mydb2/active_tx_log +0 -1
- data/lib/mydb2/index/lucene-store.db +0 -0
- data/lib/mydb2/index/lucene.log.1 +0 -0
- data/lib/mydb2/index/lucene.log.active +0 -0
- data/lib/mydb2/index/lucene.log.v0 +0 -0
- data/lib/mydb2/lock +0 -0
- data/lib/mydb2/messages.log +0 -618
- data/lib/mydb2/neostore +0 -0
- data/lib/mydb2/neostore.id +0 -0
- data/lib/mydb2/neostore.labeltokenstore.db +0 -0
- data/lib/mydb2/neostore.labeltokenstore.db.id +0 -0
- data/lib/mydb2/neostore.labeltokenstore.db.names +0 -0
- data/lib/mydb2/neostore.labeltokenstore.db.names.id +0 -0
- data/lib/mydb2/neostore.nodestore.db +0 -0
- data/lib/mydb2/neostore.nodestore.db.id +0 -0
- data/lib/mydb2/neostore.nodestore.db.labels +0 -0
- data/lib/mydb2/neostore.nodestore.db.labels.id +0 -0
- data/lib/mydb2/neostore.propertystore.db +0 -0
- data/lib/mydb2/neostore.propertystore.db.arrays +0 -0
- data/lib/mydb2/neostore.propertystore.db.arrays.id +0 -0
- data/lib/mydb2/neostore.propertystore.db.id +0 -0
- data/lib/mydb2/neostore.propertystore.db.index +0 -0
- data/lib/mydb2/neostore.propertystore.db.index.id +0 -0
- data/lib/mydb2/neostore.propertystore.db.index.keys +0 -0
- data/lib/mydb2/neostore.propertystore.db.index.keys.id +0 -0
- data/lib/mydb2/neostore.propertystore.db.strings +0 -0
- data/lib/mydb2/neostore.propertystore.db.strings.id +0 -0
- data/lib/mydb2/neostore.relationshipstore.db +0 -0
- data/lib/mydb2/neostore.relationshipstore.db.id +0 -0
- data/lib/mydb2/neostore.relationshiptypestore.db +0 -0
- data/lib/mydb2/neostore.relationshiptypestore.db.id +0 -0
- data/lib/mydb2/neostore.relationshiptypestore.db.names +0 -0
- data/lib/mydb2/neostore.relationshiptypestore.db.names.id +0 -0
- data/lib/mydb2/neostore.schemastore.db +0 -0
- data/lib/mydb2/neostore.schemastore.db.id +0 -0
- data/lib/mydb2/nioneo_logical.log.1 +0 -0
- data/lib/mydb2/nioneo_logical.log.active +0 -0
- data/lib/mydb2/nioneo_logical.log.v0 +0 -0
- data/lib/mydb2/schema/label/lucene/segments.gen +0 -0
- data/lib/mydb2/schema/label/lucene/segments_1 +0 -0
- data/lib/mydb2/schema/label/lucene/write.lock +0 -0
- data/lib/mydb2/store_lock +0 -0
- data/lib/mydb2/tm_tx_log.1 +0 -0
- data/lib/neo4j.rb~ +0 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d97243db16c4dce2d4e87eb9551116729065fe2a
|
4
|
+
data.tar.gz: 311559376e0de462bbde5d9dae2d348c041fd3f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 197a923f6617ced1dab9a81adea38fb13fe55b5bd7429b4e84c461b53c2d98b31ff053ee2eb6228541792ba58309b3058d9dee4a0cece6ec68dff79eae921ac4
|
7
|
+
data.tar.gz: c1a71b84e759fd55ab9040c6d357d08cbdf22710e5e7eacbb7b4ddff01a3b07834a4e52c2dc378feb20a6d5c9a01891839216da5918d6ac4559b9e24cfcf87f2
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 3.0.0.alpha.8
|
2
|
+
* Integration with new Query API from neo4j-core including:
|
3
|
+
* - .query_as and #query_as methods to get queries from models (#366)
|
4
|
+
* - .qq method for QuickQuery syntax ( https://github.com/andreasronge/neo4j/wiki/Neo4j-v3#quickquery-work-in-progress / #366)
|
5
|
+
* Before and after callbacks on associations (#373)
|
6
|
+
* .find / .all / .count changed to be more like ActiveRecord
|
7
|
+
* .first / .last methods (#378)
|
8
|
+
* .find_by / .find_by! (#375)
|
9
|
+
|
1
10
|
== 3.0.0.alpha.7
|
2
11
|
* Bug fix uniqueness-validator (#356 from JohnKellyFerguson)
|
3
12
|
* Many improvements, like update_attributes and validation while impl orm_adapter, Brian Underwood
|
data/lib/neo4j.rb
CHANGED
@@ -28,6 +28,9 @@ require 'neo4j/active_node/rels'
|
|
28
28
|
require 'neo4j/active_node/has_n'
|
29
29
|
require 'neo4j/active_node/has_n/decl_rel'
|
30
30
|
require 'neo4j/active_node/has_n/nodes'
|
31
|
+
require 'neo4j/active_node/query/query_proxy'
|
32
|
+
require 'neo4j/active_node/query'
|
33
|
+
require 'neo4j/active_node/quick_query'
|
31
34
|
require 'neo4j/active_node'
|
32
35
|
|
33
36
|
require 'neo4j/active_node/orm_adapter'
|
data/lib/neo4j/active_node.rb
CHANGED
@@ -75,7 +75,7 @@ module Neo4j::ActiveNode
|
|
75
75
|
#
|
76
76
|
#
|
77
77
|
# @return [Neo4j::ActiveNode::HasN::DeclRel] a DSL object where the has_n relationship can be further specified
|
78
|
-
def has_n(rel_type)
|
78
|
+
def has_n(rel_type, *callbacks)
|
79
79
|
clazz = self
|
80
80
|
module_eval(%Q{def #{rel_type}=(values)
|
81
81
|
#{rel_type}_rels.each {|rel| rel.del }
|
@@ -103,8 +103,7 @@ module Neo4j::ActiveNode
|
|
103
103
|
def #{rel_type}
|
104
104
|
_decl_rels[:#{rel_type}].rel_type
|
105
105
|
end}, __FILE__, __LINE__)
|
106
|
-
|
107
|
-
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, false, clazz)
|
106
|
+
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, false, clazz, *callbacks)
|
108
107
|
end
|
109
108
|
|
110
109
|
|
@@ -126,13 +125,14 @@ module Neo4j::ActiveNode
|
|
126
125
|
# file.folder_rel # => the relationship object between those nodes
|
127
126
|
#
|
128
127
|
# @return [Neo4j::ActiveNode::HasN::DeclRel] a DSL object where the has_one relationship can be futher specified
|
129
|
-
def has_one(rel_type)
|
128
|
+
def has_one(rel_type, *callbacks)
|
130
129
|
clazz = self
|
131
130
|
module_eval(%Q{def #{rel_type}=(value)
|
131
|
+
return if !value
|
132
132
|
dsl = _decl_rels_for(:#{rel_type})
|
133
133
|
rel = dsl.single_relationship(self)
|
134
134
|
rel && rel.del
|
135
|
-
dsl.create_relationship_to(self, value)
|
135
|
+
dsl.create_relationship_to(self, value)
|
136
136
|
end}, __FILE__, __LINE__)
|
137
137
|
|
138
138
|
module_eval(%Q{def #{rel_type}
|
@@ -150,7 +150,7 @@ module Neo4j::ActiveNode
|
|
150
150
|
_decl_rels[:#{rel_type}].rel_type
|
151
151
|
end}, __FILE__, __LINE__)
|
152
152
|
|
153
|
-
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, true, clazz)
|
153
|
+
_decl_rels[rel_type.to_sym] = DeclRel.new(rel_type, true, clazz, *callbacks)
|
154
154
|
end
|
155
155
|
|
156
156
|
|
@@ -33,12 +33,16 @@ module Neo4j
|
|
33
33
|
class DeclRel
|
34
34
|
attr_reader :source_class, :dir, :rel_type, :method_id
|
35
35
|
|
36
|
-
def initialize(method_id, has_one, source_class)
|
36
|
+
def initialize(method_id, has_one, source_class, *callbacks)
|
37
37
|
@method_id = method_id
|
38
38
|
@has_one = has_one
|
39
39
|
@dir = :outgoing
|
40
40
|
@rel_type = method_id.to_sym
|
41
41
|
@source_class = source_class
|
42
|
+
unless callbacks.empty?
|
43
|
+
@before_callback = callbacks.first[:before] || nil
|
44
|
+
@after_callback = callbacks.first[:after] || nil
|
45
|
+
end
|
42
46
|
end
|
43
47
|
|
44
48
|
def inherit_new
|
@@ -223,7 +227,23 @@ module Neo4j
|
|
223
227
|
# @private
|
224
228
|
def create_relationship_to(node, other, relationship_props={}) # :nodoc:
|
225
229
|
from, to = incoming? ? [other, node] : [node, other]
|
226
|
-
|
230
|
+
before_callback_result = do_before_callback(node, from, to)
|
231
|
+
return false if before_callback_result == false
|
232
|
+
|
233
|
+
result = from.create_rel(@rel_type, to, relationship_props)
|
234
|
+
|
235
|
+
after_callback_result = do_after_callback(node, from, to)
|
236
|
+
after_callback_result == false ? false : result
|
237
|
+
end
|
238
|
+
|
239
|
+
private
|
240
|
+
|
241
|
+
def do_before_callback(caller, from, to)
|
242
|
+
@before_callback ? caller.send(@before_callback, from, to) : true
|
243
|
+
end
|
244
|
+
|
245
|
+
def do_after_callback(caller, from, to)
|
246
|
+
@after_callback ? caller.send(@after_callback, from, to) : true
|
227
247
|
end
|
228
248
|
|
229
249
|
end
|
@@ -8,6 +8,7 @@ module Neo4j
|
|
8
8
|
|
9
9
|
WRAPPED_CLASSES = []
|
10
10
|
class InvalidQueryError < StandardError; end
|
11
|
+
class RecordNotFound < StandardError; end
|
11
12
|
|
12
13
|
# @return the labels
|
13
14
|
# @see Neo4j-core
|
@@ -59,37 +60,45 @@ module Neo4j
|
|
59
60
|
|
60
61
|
module ClassMethods
|
61
62
|
|
62
|
-
# Find all nodes/objects of this class
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
63
|
+
# Find all nodes/objects of this class
|
64
|
+
def all
|
65
|
+
self.query_as(:n).pluck(:n)
|
66
|
+
end
|
67
|
+
|
68
|
+
def first
|
69
|
+
self.query_as(:n).limit(1).order('n.neo_id').pluck(:n).first
|
70
|
+
end
|
71
|
+
|
72
|
+
def last
|
73
|
+
count = self.count
|
74
|
+
final_count = count == 0 ? 0 : count - 1
|
75
|
+
self.query_as(:n).order('n.neo_id').skip(final_count).limit(1).pluck(:n).first
|
71
76
|
end
|
72
77
|
|
73
78
|
# @return [Fixnum] number of nodes of this class
|
74
|
-
def count
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
#
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
79
|
+
def count
|
80
|
+
self.query_as(:n).return("count(n) AS count").first.count
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the object with the specified neo4j id.
|
84
|
+
# @param [String,Fixnum] neo_id of node to find
|
85
|
+
def find(id)
|
86
|
+
raise "Unknown argument #{id.class} in find method" if not [String, Fixnum].include?(id.class)
|
87
|
+
|
88
|
+
Neo4j::Node.load(id.to_i)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Finds the first record matching the specified conditions. There is no implied ordering so if order matters, you should specify it yourself.
|
92
|
+
# @param [Hash] hash of arguments to find
|
93
|
+
def find_by(*args)
|
94
|
+
self.query_as(:n).where(n: eval(args.join)).limit(1).pluck(:n).first
|
91
95
|
end
|
92
96
|
|
97
|
+
# Like find_by, except that if no record is found, raises a RecordNotFound error.
|
98
|
+
def find_by!(*args)
|
99
|
+
a = eval(args.join)
|
100
|
+
find_by(args) or raise RecordNotFound, "#{self.query_as(:n).where(n: a).limit(1).to_cypher} returned no results"
|
101
|
+
end
|
93
102
|
|
94
103
|
# Destroy all nodes an connected relationships
|
95
104
|
def destroy_all
|
@@ -129,54 +138,6 @@ module Neo4j
|
|
129
138
|
|
130
139
|
protected
|
131
140
|
|
132
|
-
def find_by_hash(query, session)
|
133
|
-
validate_query!(query)
|
134
|
-
|
135
|
-
extract_relationship_conditions!(query)
|
136
|
-
|
137
|
-
session.query(query.merge(label: mapped_label_name))
|
138
|
-
end
|
139
|
-
|
140
|
-
# Raises an error if query is malformed
|
141
|
-
def validate_query!(query)
|
142
|
-
invalid_query_keys = query.keys.map(&:to_sym) - [:conditions, :order, :limit, :skip]
|
143
|
-
|
144
|
-
raise InvalidQueryError, "Invalid query keys: #{invalid_query_keys.join(', ')}" if not invalid_query_keys.empty?
|
145
|
-
end
|
146
|
-
|
147
|
-
# Takes out :conditions query keys for associations and creates corresponding :conditions and :match keys
|
148
|
-
# example:
|
149
|
-
# class Person
|
150
|
-
# property :name
|
151
|
-
# has_n :friend
|
152
|
-
# end
|
153
|
-
#
|
154
|
-
# :conditions => {name: 'Fred', friend: person}
|
155
|
-
# should result in:
|
156
|
-
# :conditions => {name => 'Fred', 'id(n1)' => person.id}, :match => 'n--n1'
|
157
|
-
#
|
158
|
-
def extract_relationship_conditions!(query)
|
159
|
-
node_num = 1
|
160
|
-
if query[:conditions]
|
161
|
-
query[:conditions].dup.each do |key, value|
|
162
|
-
if has_one_relationship?(key)
|
163
|
-
neo_id = value.try(:neo_id) || value
|
164
|
-
raise InvalidQueryError, "Invalid value for '#{key}' condition" if not neo_id.is_a?(Integer)
|
165
|
-
|
166
|
-
query[:match] ||= []
|
167
|
-
n_string = "n#{node_num}"
|
168
|
-
dir = relationship_dir(key)
|
169
|
-
|
170
|
-
match = dir == :outgoing ? "n-->(#{n_string})" : "n<--(#{n_string})"
|
171
|
-
query[:match] << match
|
172
|
-
query[:conditions]["id(#{n_string})"] = neo_id.to_i
|
173
|
-
query[:conditions].delete(key)
|
174
|
-
node_num += 1
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
141
|
def _index(property)
|
181
142
|
mapped_labels.each do |label|
|
182
143
|
# make sure the property is not indexed twice
|
@@ -37,12 +37,9 @@ module Neo4j
|
|
37
37
|
extract_id!(conditions)
|
38
38
|
order = hasherize_order(order)
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
result = klass.find(conditions: conditions)
|
44
|
-
result
|
45
|
-
end
|
40
|
+
result = klass.where(conditions)
|
41
|
+
result = result.order(order) unless order.empty?
|
42
|
+
result.first
|
46
43
|
end
|
47
44
|
|
48
45
|
# Find all models matching conditions
|
@@ -51,12 +48,10 @@ module Neo4j
|
|
51
48
|
extract_id!(conditions)
|
52
49
|
order = hasherize_order(order)
|
53
50
|
|
54
|
-
result =
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
|
51
|
+
result = klass.where(conditions)
|
52
|
+
result = result.order(order) unless order.empty?
|
53
|
+
result = result.skip(offset) if offset
|
54
|
+
result = result.limit(limit) if limit
|
60
55
|
result.to_a
|
61
56
|
end
|
62
57
|
|
@@ -78,7 +73,7 @@ module Neo4j
|
|
78
73
|
|
79
74
|
def extract_id!(conditions)
|
80
75
|
if id = conditions.delete(:id)
|
81
|
-
conditions[
|
76
|
+
conditions[:neo_id] = id.to_i
|
82
77
|
end
|
83
78
|
end
|
84
79
|
|
@@ -19,20 +19,15 @@ module Neo4j::ActiveNode
|
|
19
19
|
# If any of them fail the action is cancelled and save returns false. If the flag is false validations are bypassed altogether. See ActiveRecord::Validations for more information.
|
20
20
|
# There’s a series of callbacks associated with save. If any of the before_* callbacks return false the action is cancelled and save returns false.
|
21
21
|
def save(*)
|
22
|
-
# Update magic properties
|
23
22
|
update_magic_properties
|
24
23
|
create_or_update
|
25
24
|
end
|
26
25
|
|
27
|
-
def update_magic_properties
|
28
|
-
self.updated_at = DateTime.now if respond_to?(:updated_at=) && changed?
|
29
|
-
end
|
30
|
-
|
31
26
|
# Creates a model with values matching those of the instance attributes and returns its id.
|
32
27
|
# @private
|
33
28
|
# @return true
|
34
29
|
def create_model(*)
|
35
|
-
|
30
|
+
set_timestamps
|
36
31
|
properties = convert_properties_to :db, props
|
37
32
|
node = _create_node(properties)
|
38
33
|
init_on_load(node, node.props)
|
@@ -234,12 +229,20 @@ module Neo4j::ActiveNode
|
|
234
229
|
|
235
230
|
private
|
236
231
|
|
232
|
+
def update_magic_properties
|
233
|
+
self.updated_at = DateTime.now if respond_to?(:updated_at=) && changed?
|
234
|
+
end
|
235
|
+
|
237
236
|
def assign_attributes(attributes)
|
238
237
|
attributes.each do |attribute, value|
|
239
238
|
send("#{attribute}=", value)
|
240
239
|
end
|
241
240
|
end
|
242
241
|
|
242
|
+
def set_timestamps
|
243
|
+
self.created_at = DateTime.now if respond_to?(:created_at=)
|
244
|
+
self.updated_at = self.created_at if respond_to?(:updated_at=)
|
245
|
+
end
|
243
246
|
end
|
244
247
|
|
245
248
|
end
|
@@ -15,9 +15,7 @@ module Neo4j::ActiveNode
|
|
15
15
|
def initialize(attributes={}, options={})
|
16
16
|
relationship_props = self.class.extract_relationship_attributes!(attributes)
|
17
17
|
writer_method_props = extract_writer_methods!(attributes)
|
18
|
-
|
19
18
|
validate_attributes!(attributes)
|
20
|
-
|
21
19
|
writer_method_props.each do |key, value|
|
22
20
|
self.send("#{key}=", value)
|
23
21
|
end
|
@@ -59,11 +57,15 @@ module Neo4j::ActiveNode
|
|
59
57
|
module ClassMethods
|
60
58
|
|
61
59
|
def property(name, options={})
|
62
|
-
|
63
|
-
|
60
|
+
magic_properties(name, options)
|
61
|
+
|
62
|
+
# if (name.to_s == 'remember_created_at')
|
63
|
+
# binding.pry
|
64
|
+
# end
|
64
65
|
attribute(name, options)
|
65
66
|
end
|
66
67
|
|
68
|
+
#overrides ActiveAttr's attribute! method
|
67
69
|
def attribute!(name, options={})
|
68
70
|
super(name, options)
|
69
71
|
define_method("#{name}=") do |value|
|
@@ -83,6 +85,24 @@ module Neo4j::ActiveNode
|
|
83
85
|
end
|
84
86
|
end
|
85
87
|
|
88
|
+
private
|
89
|
+
|
90
|
+
# Tweaks properties
|
91
|
+
def magic_properties(name, options)
|
92
|
+
set_stamp_type(name, options)
|
93
|
+
set_time_as_datetime(options)
|
94
|
+
end
|
95
|
+
|
96
|
+
def set_stamp_type(name, options)
|
97
|
+
options[:type] = DateTime if (name.to_sym == :created_at || name.to_sym == :updated_at)
|
98
|
+
end
|
99
|
+
|
100
|
+
# ActiveAttr does not handle "Time", Rails and Neo4j.rb 2.3 did
|
101
|
+
# Convert it to DateTime in the interest of consistency
|
102
|
+
def set_time_as_datetime(options)
|
103
|
+
options[:type] = DateTime if options[:type] == Time
|
104
|
+
end
|
105
|
+
|
86
106
|
end
|
87
107
|
end
|
88
108
|
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module ActiveNode
|
3
|
+
|
4
|
+
def qq(as = :n1)
|
5
|
+
QuickQuery.new(self, as, self.class)
|
6
|
+
end
|
7
|
+
|
8
|
+
# Helper methods to return Neo4j::Core::Query objects. A query object can be used to successively build a cypher query
|
9
|
+
#
|
10
|
+
# person.query_as(:n).match('n-[:friend]-o').return(o: :name) # Return the names of all the person's friends
|
11
|
+
#
|
12
|
+
module Query
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
# Returns a Query object with the current node matched the specified variable name
|
16
|
+
#
|
17
|
+
# @example Return the names of all of Mike's friends
|
18
|
+
# # Generates: MATCH (mike:Person), mike-[:friend]-friend WHERE ID(mike) = 123 RETURN friend.name
|
19
|
+
# mike.query_as(:mike).match('mike-[:friend]-friend').return(friend: :name)
|
20
|
+
#
|
21
|
+
# @param var [Symbol, String] The variable name to specify in the query
|
22
|
+
# @return [Neo4j::Core::Query]
|
23
|
+
def query_as(var)
|
24
|
+
self.class.query_as(var).where("ID(#{var}) = #{self.neo_id}")
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
# Returns a Query object with all nodes for the model matched as the specified variable name
|
29
|
+
#
|
30
|
+
# @example Return the registration number of all cars owned by a person over the age of 30
|
31
|
+
# # Generates: MATCH (person:Person), person-[:owned]-car WHERE person.age > 30 RETURN car.registration_number
|
32
|
+
# Person.query_as(:person).where('person.age > 30').match('person-[:owned]-car').return(car: :registration_number)
|
33
|
+
#
|
34
|
+
# @param var [Symbol, String] The variable name to specify in the query
|
35
|
+
# @return [Neo4j::Core::Query]
|
36
|
+
def query_as(var)
|
37
|
+
label = self.respond_to?(:mapped_label_name) ? self.mapped_label_name : self
|
38
|
+
neo4j_session.query.match(var => label)
|
39
|
+
end
|
40
|
+
|
41
|
+
Neo4j::ActiveNode::Query::QueryProxy::METHODS.each do |method|
|
42
|
+
module_eval(%Q{
|
43
|
+
def #{method}(*args)
|
44
|
+
Neo4j::ActiveNode::Query::QueryProxy.new(self).#{method}(*args)
|
45
|
+
end}, __FILE__, __LINE__)
|
46
|
+
end
|
47
|
+
|
48
|
+
def qq(as = :n1)
|
49
|
+
QuickQuery.new(self.name.constantize, as)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|