neo4j 3.0.2 → 3.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +10 -1
- data/Gemfile +1 -1
- data/README.md +5 -1
- data/lib/neo4j/active_node/has_n/association.rb +7 -3
- data/lib/neo4j/active_node/persistence.rb +14 -3
- data/lib/neo4j/active_node/query/query_proxy.rb +1 -2
- data/lib/neo4j/active_node/query/query_proxy_methods.rb +1 -1
- data/lib/neo4j/active_node/query_methods.rb +17 -0
- data/lib/neo4j/active_rel/persistence.rb +1 -1
- data/lib/neo4j/active_rel/query.rb +9 -1
- data/lib/neo4j/paginated.rb +8 -2
- data/lib/neo4j/version.rb +1 -1
- data/neo4j.gemspec +2 -2
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d902cb2867667c62e30b5a4c0ca2aa5341b06cc
|
4
|
+
data.tar.gz: 95ce7ebf16a229a510ab76aeb1e40b69275e1dc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 265e6724e37c3a89d7af59dcc2484915cd0d39b60e1cf642bd22ed1f0a6d997aa09163186148e78803f7cec552be2c07f0ce9eb503f572208c116313da6db764
|
7
|
+
data.tar.gz: c84429373e502d634d4b29c6a0ab864af15e4def869260693bfba8789c4a610c2406f2dd611d6d84317ca2a55199c267d642342f1610966d5a210a351ae873eb
|
data/CHANGELOG
CHANGED
@@ -1,8 +1,17 @@
|
|
1
|
+
== 3.0.3
|
2
|
+
* Gemspec has been updated to require neo4j-core 3.0.5
|
3
|
+
* Added `find_in_batches`
|
4
|
+
* Pagination has been updated to allow better ordering. Relaunch of neo4j-will_paginate as neo4j-will_paginate_redux is imminent!
|
5
|
+
* Everything is better: `create`'s handling of blocks, better behavior from `count`, better ActiveRel from_class/to_class checks, better handling of rel_class strings, and more
|
6
|
+
* Added a new find_or_create_by class method
|
7
|
+
|
8
|
+
Big thanks to new contributors Miha Rekar and Michael Perez! Also check out or Github issues, where we're discussing changes for 3.1.0. https://github.com/neo4jrb/neo4j/issues
|
9
|
+
|
1
10
|
== 3.0.2
|
2
11
|
* "Model#all" now evaluates lazily, models no longer include Enumerable
|
3
12
|
* Faster, more efficient uniqueness validations
|
4
13
|
* Adjusted many common queries to use params, will improve performance
|
5
|
-
* ActiveRel fixes: create uses Core Query instead of Core's `rels` method, `{ classname: #{_classname} }` no longer inserted into every query, find related node IDs without loading the nodes
|
14
|
+
* ActiveRel fixes: create uses Core Query instead of Core's `rels` method, `{ classname: #{_classname} }` no longer inserted into every query, find related node IDs without loading the nodes
|
6
15
|
* Allow inheritance when checking model class on a relation (Andrew Jones)
|
7
16
|
* Provided migrations will use Rake.original_dir instead of Rails.env to provide better compatibility with frameworks other than Rails
|
8
17
|
* rel_class option in ActiveNode models will now accept string of a model name
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
# Welcome to Neo4j.rb
|
1
|
+
# Welcome to Neo4j.rb
|
2
|
+
[![Build Status](https://secure.travis-ci.org/neo4jrb/neo4j.png?branch=master)](http://travis-ci.org/neo4jrb/neo4j) [![Coverage Status](https://coveralls.io/repos/neo4jrb/neo4j/badge.png?branch=master)](https://coveralls.io/r/neo4jrb/neo4j?branch=master) [![Code Climate](https://codeclimate.com/github/neo4jrb/neo4j.png)](https://codeclimate.com/github/andreasronge/neo4j)
|
2
3
|
|
3
4
|
Neo4j.rb is an Active Model compliant Ruby/JRuby wrapper for [the Neo4j graph database](http://www.neo4j.org/). It uses the [neo4j-core](https://github.com/neo4jrb/neo4j-core) and [active_attr](https://github.com/cgriego/active_attr) gems.
|
4
5
|
|
6
|
+
Winner of a 2014 Graphie for "Best Community Contribution" at Neo4j's [Graph Connect](http://graphconnect.com) conference!
|
7
|
+
![2014 Graphie](http://i.imgur.com/CkOoTTYm.jpg)
|
8
|
+
|
5
9
|
## Modern (3.X) Documentation
|
6
10
|
|
7
11
|
* [Wiki](https://github.com/neo4jrb/neo4j/wiki/Neo4j.rb-v3-Introduction)
|
@@ -27,7 +27,7 @@ module Neo4j
|
|
27
27
|
relationship_name_cypher = ":`#{relationship_type}`" if relationship_type
|
28
28
|
properties_string = get_properties_string(properties)
|
29
29
|
relationship_cypher = get_relationship_cypher(var, relationship_name_cypher, properties_string)
|
30
|
-
get_direction(relationship_cypher, create)
|
30
|
+
get_direction(relationship_cypher, create)
|
31
31
|
end
|
32
32
|
|
33
33
|
def target_class_name
|
@@ -73,8 +73,12 @@ module Neo4j
|
|
73
73
|
@relationship_class._type
|
74
74
|
end
|
75
75
|
|
76
|
+
def relationship_class_name
|
77
|
+
@relationship_class_name ||= @relationship_class.respond_to?(:constantize) ? @relationship_class : @relationship_class.name
|
78
|
+
end
|
79
|
+
|
76
80
|
def inject_classname(properties)
|
77
|
-
properties[Neo4j::Config.class_name_property] =
|
81
|
+
properties[Neo4j::Config.class_name_property] = relationship_class_name if @relationship_class
|
78
82
|
properties
|
79
83
|
end
|
80
84
|
|
@@ -117,7 +121,7 @@ module Neo4j
|
|
117
121
|
@relationship_class = options[:rel_class]
|
118
122
|
@relationship_type = options[:type] && options[:type].to_sym
|
119
123
|
end
|
120
|
-
|
124
|
+
|
121
125
|
# Return basic details about association as declared in the model
|
122
126
|
# @example
|
123
127
|
# has_many :in, :bands
|
@@ -68,12 +68,13 @@ module Neo4j::ActiveNode
|
|
68
68
|
end
|
69
69
|
|
70
70
|
module ClassMethods
|
71
|
-
# Creates
|
71
|
+
# Creates and saves a new node
|
72
72
|
# @param [Hash] props the properties the new node should have
|
73
|
-
def create(props = {})
|
73
|
+
def create(props = {}, &block)
|
74
74
|
association_props = extract_association_attributes!(props)
|
75
75
|
|
76
76
|
new(props).tap do |obj|
|
77
|
+
yield obj if block_given?
|
77
78
|
obj.save
|
78
79
|
association_props.each do |prop, value|
|
79
80
|
obj.send("#{prop}=", value)
|
@@ -82,7 +83,7 @@ module Neo4j::ActiveNode
|
|
82
83
|
end
|
83
84
|
|
84
85
|
# Same as #create, but raises an error if there is a problem during save.
|
85
|
-
def create!(*args)
|
86
|
+
def create!(*args, &block)
|
86
87
|
props = args[0] || {}
|
87
88
|
association_props = extract_association_attributes!(props)
|
88
89
|
|
@@ -95,6 +96,16 @@ module Neo4j::ActiveNode
|
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
99
|
+
# Finds the first node with the given attributes, or calls create if none found
|
100
|
+
def find_or_create_by(attributes, &block)
|
101
|
+
find_by(attributes) || create(attributes, &block)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Same as #find_or_create_by, but calls #create! so it raises an error if there is a problem during save.
|
105
|
+
def find_or_create_by!(attributes, &block)
|
106
|
+
find_by(attributes) || create!(attributes, &block)
|
107
|
+
end
|
108
|
+
|
98
109
|
def load_entity(id)
|
99
110
|
Neo4j::Node.load(id)
|
100
111
|
end
|
@@ -174,12 +174,11 @@ module Neo4j
|
|
174
174
|
end
|
175
175
|
|
176
176
|
attr_reader :context
|
177
|
+
attr_reader :node_var
|
177
178
|
|
178
179
|
protected
|
179
180
|
# Methods are underscored to prevent conflict with user class methods
|
180
181
|
|
181
|
-
attr_reader :node_var
|
182
|
-
|
183
182
|
def _add_params(params)
|
184
183
|
@params = @params.merge(params)
|
185
184
|
end
|
@@ -21,7 +21,7 @@ module Neo4j
|
|
21
21
|
raise(InvalidParameterError, ':count accepts `distinct` or nil as a parameter') unless distinct.nil? || distinct == :distinct
|
22
22
|
query_with_target(target) do |target|
|
23
23
|
q = distinct.nil? ? target : "DISTINCT #{target}"
|
24
|
-
self.query.
|
24
|
+
self.query.pluck("count(#{q}) AS #{target}").first
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -36,6 +36,23 @@ module Neo4j
|
|
36
36
|
|
37
37
|
alias_method :blank?, :empty?
|
38
38
|
|
39
|
+
def include?(other)
|
40
|
+
raise(InvalidParameterError, ':include? only accepts nodes') unless other.respond_to?(:neo_id)
|
41
|
+
self.query_as(:n).where(n: {primary_key => other.id}).return("count(n) AS count").first.count > 0
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_in_batches(options = {})
|
45
|
+
self.query_as(:n).return(:n).find_in_batches(:n, primary_key, options) do |batch|
|
46
|
+
yield batch.map(&:n)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def find_each(options = {})
|
51
|
+
self.query_as(:n).return(:n).find_each(:n, primary_key, options) do |batch|
|
52
|
+
yield batch.n
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
39
56
|
private
|
40
57
|
|
41
58
|
def exists_query_start(node_condition)
|
@@ -54,7 +54,7 @@ module Neo4j::ActiveRel
|
|
54
54
|
[from_node, to_node].each do |node|
|
55
55
|
type = from_node == node ? :_from_class : :_to_class
|
56
56
|
next if allows_any_class?(type)
|
57
|
-
raise ModelClassInvalidError, "Node class was #{node.class}, expected #{self.class.send(type)}" unless class_as_constant(type) == node.class
|
57
|
+
raise ModelClassInvalidError, "Node class was #{node.class}, expected #{self.class.send(type)}" unless class_as_constant(type) == node.class || node.class.ancestors.include?(class_as_constant(type))
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -23,7 +23,11 @@ module Neo4j::ActiveRel
|
|
23
23
|
# @example Match with a string
|
24
24
|
# MyRelClass.where('r1.grade > r1')
|
25
25
|
def where(args={})
|
26
|
-
|
26
|
+
where_query.where(where_string(args)).pluck(:r1)
|
27
|
+
end
|
28
|
+
|
29
|
+
def array_load(ids_array)
|
30
|
+
where_query.where("ID(r1) IN {ids_array}").params(ids_array: ids_array).pluck(:r1)
|
27
31
|
end
|
28
32
|
|
29
33
|
# Performs a basic match on the relationship, returning all results.
|
@@ -42,6 +46,10 @@ module Neo4j::ActiveRel
|
|
42
46
|
|
43
47
|
private
|
44
48
|
|
49
|
+
def where_query
|
50
|
+
Neo4j::Session.query.match("#{cypher_string(:outbound)}-[r1:`#{self._type}`]->#{cypher_string(:inbound)}")
|
51
|
+
end
|
52
|
+
|
45
53
|
def all_query
|
46
54
|
Neo4j::Session.query.match("#{cypher_string}-[r1:`#{self._type}`]->#{cypher_string(:inbound)}")
|
47
55
|
end
|
data/lib/neo4j/paginated.rb
CHANGED
@@ -7,10 +7,16 @@ module Neo4j
|
|
7
7
|
@items, @total, @current_page = items, total, current_page
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.create_from(source, page, per_page)
|
10
|
+
def self.create_from(source, page, per_page, order = nil)
|
11
11
|
#partial = source.drop((page-1) * per_page).first(per_page)
|
12
|
+
target = source.node_var
|
12
13
|
partial = source.skip(page-1).limit(per_page)
|
13
|
-
|
14
|
+
ordered_partial, ordered_source = if order
|
15
|
+
[partial.order_by(order), source.query.with("#{target} as #{target}").pluck("COUNT(#{target})").first]
|
16
|
+
else
|
17
|
+
[partial, source.count]
|
18
|
+
end
|
19
|
+
Paginated.new(ordered_partial, ordered_source, page)
|
14
20
|
end
|
15
21
|
|
16
22
|
delegate :each, :to => :items
|
data/lib/neo4j/version.rb
CHANGED
data/neo4j.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
|
12
12
|
s.authors = "Andreas Ronge"
|
13
13
|
s.email = 'andreas.ronge@gmail.com'
|
14
|
-
s.homepage = "https://github.com/
|
14
|
+
s.homepage = "https://github.com/neo4jrb/neo4j/"
|
15
15
|
s.rubyforge_project = 'neo4j'
|
16
16
|
s.summary = "A graph database for Ruby"
|
17
17
|
s.license = 'MIT'
|
@@ -31,7 +31,7 @@ A Neo4j OGM (Object-Graph-Mapper) for use in Ruby on Rails and Rack frameworks,
|
|
31
31
|
s.add_dependency("activesupport", "~> 4")
|
32
32
|
s.add_dependency("railties", "~> 4")
|
33
33
|
s.add_dependency('active_attr', "~> 0.8")
|
34
|
-
s.add_dependency("neo4j-core", "~> 3.0.
|
34
|
+
s.add_dependency("neo4j-core", "~> 3.0.5")
|
35
35
|
|
36
36
|
if RUBY_PLATFORM =~ /java/
|
37
37
|
s.add_dependency("neo4j-community", '~> 2.0')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: orm_adapter
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.0.
|
89
|
+
version: 3.0.5
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 3.0.
|
96
|
+
version: 3.0.5
|
97
97
|
description: |
|
98
98
|
A Neo4j OGM (Object-Graph-Mapper) for use in Ruby on Rails and Rack frameworks, intended as a complete replacement for ActiveRecord.
|
99
99
|
email: andreas.ronge@gmail.com
|
@@ -160,7 +160,7 @@ files:
|
|
160
160
|
- lib/rails/generators/neo4j/model/templates/model.erb
|
161
161
|
- lib/rails/generators/neo4j_generator.rb
|
162
162
|
- neo4j.gemspec
|
163
|
-
homepage: https://github.com/
|
163
|
+
homepage: https://github.com/neo4jrb/neo4j/
|
164
164
|
licenses:
|
165
165
|
- MIT
|
166
166
|
metadata: {}
|
@@ -187,7 +187,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
187
|
version: '0'
|
188
188
|
requirements: []
|
189
189
|
rubyforge_project: neo4j
|
190
|
-
rubygems_version: 2.
|
190
|
+
rubygems_version: 2.4.2
|
191
191
|
signing_key:
|
192
192
|
specification_version: 4
|
193
193
|
summary: A graph database for Ruby
|