neo4j-core 3.0.0.alpha.18 → 3.0.0.alpha.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.md +2 -1
- data/lib/neo4j-core/query.rb +1 -1
- data/lib/neo4j-core/version.rb +1 -1
- data/lib/neo4j-core/version.rb~ +5 -0
- data/lib/neo4j-embedded.rb +1 -0
- data/lib/neo4j-embedded/cypher_response.rb~ +85 -0
- data/lib/neo4j-embedded/embedded_node.rb~ +201 -0
- data/lib/neo4j-embedded/embedded_relationship.rb +4 -0
- data/lib/neo4j-embedded/embedded_relationship.rb~ +62 -0
- data/lib/neo4j-embedded/embedded_session.rb +14 -0
- data/lib/neo4j-embedded/embedded_session.rb~ +145 -0
- data/lib/neo4j-embedded/embedded_transaction.rb +35 -0
- data/lib/neo4j-embedded/property.rb +6 -2
- data/lib/neo4j-server/cypher_node.rb +20 -7
- data/lib/neo4j-server/cypher_relationship.rb +16 -4
- data/lib/neo4j-server/cypher_response.rb +43 -17
- data/lib/neo4j-server/cypher_response.rb~ +155 -0
- data/lib/neo4j-server/cypher_session.rb +26 -3
- data/lib/neo4j-server/cypher_transaction.rb +14 -21
- data/lib/neo4j/node.rb +5 -7
- data/lib/neo4j/relationship.rb +5 -0
- data/lib/neo4j/session.rb +16 -0
- data/lib/neo4j/session.rb~ +202 -0
- data/lib/neo4j/transaction.rb +100 -33
- metadata +53 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 99c353a80ee0078fb684f74860c6b9adab86f81a
|
4
|
+
data.tar.gz: 5164eb9d290c70506f2e38c8e70952b59e058b0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff3c176237a7fe786532cee32b922fcf6e239c9493bf3a64b0da3adf38d4e73941948cad014bcb486aab6ddfb6ece763b11cc14e65e89b354504d520d9d513bf
|
7
|
+
data.tar.gz: c4a5a1e0b1597f5a0f12ad4a88d8b13f730429101552a778f99583efbe3eddabec83f6964fea15193084e1da7bbc5e7839a2e9e09df2539843bc3b9d017efcac
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -42,7 +42,7 @@ require 'neo4j/tasks/neo4j_server'
|
|
42
42
|
|
43
43
|
Install and start neo4j by typing:
|
44
44
|
```
|
45
|
-
rake neo4j:install[community-2.1.
|
45
|
+
rake neo4j:install[community-2.1.3]
|
46
46
|
rake neo4j:start
|
47
47
|
```
|
48
48
|
|
@@ -61,6 +61,7 @@ No need to start the server since it is embedded.
|
|
61
61
|
* [Neo4j::Relationship](http://www.rubydoc.info/github/andreasronge/neo4j-core/Neo4j/Relationship)
|
62
62
|
* [Neo4j::Session](http://www.rubydoc.info/github/andreasronge/neo4j-core/Neo4j/Session)
|
63
63
|
* [Neo4j::Label](http://www.rubydoc.info/github/andreasronge/neo4j-core/Neo4j/Label)
|
64
|
+
* [Neo4j::Transaction](http://www.rubydoc.info/github/andreasronge/neo4j-core/Neo4j/Transaction)
|
64
65
|
* [Neo4j::Query](Neo4j/Query.html)
|
65
66
|
|
66
67
|
See also [Neo4j Docs](http://docs.neo4j.org/)
|
data/lib/neo4j-core/query.rb
CHANGED
@@ -155,7 +155,7 @@ module Neo4j::Core
|
|
155
155
|
def each
|
156
156
|
response = self.response
|
157
157
|
if response.is_a?(Neo4j::Server::CypherResponse)
|
158
|
-
|
158
|
+
response.to_node_enumeration
|
159
159
|
else
|
160
160
|
Neo4j::Embedded::ResultWrapper.new(response, self.to_cypher)
|
161
161
|
end.each {|object| yield object }
|
data/lib/neo4j-core/version.rb
CHANGED
data/lib/neo4j-embedded.rb
CHANGED
@@ -8,6 +8,7 @@ require 'neo4j-embedded/embedded_label'
|
|
8
8
|
require 'neo4j-embedded/embedded_node'
|
9
9
|
require 'neo4j-embedded/embedded_relationship'
|
10
10
|
require 'neo4j-embedded/embedded_label'
|
11
|
+
require 'neo4j-embedded/embedded_transaction'
|
11
12
|
require 'neo4j-embedded/cypher_response'
|
12
13
|
|
13
14
|
# TODO replace this with https://github.com/intridea/hashie gem
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Neo4j::Embedded
|
2
|
+
|
3
|
+
# Wraps the Cypher query result.
|
4
|
+
# Loads the node and relationships wrapper if possible and use symbol as column keys.
|
5
|
+
# This is typically used in the native neo4j bindings since result does is not a Ruby enumerable with symbols as keys.
|
6
|
+
# @note The result is a once forward read only Enumerable, work if you need to read the result twice - use #to_a
|
7
|
+
#
|
8
|
+
class ResultWrapper
|
9
|
+
class ResultsAlreadyConsumedException < Exception;
|
10
|
+
end
|
11
|
+
|
12
|
+
include Enumerable
|
13
|
+
|
14
|
+
# @return the original result from the Neo4j Cypher Engine, once forward read only !
|
15
|
+
attr_reader :source
|
16
|
+
|
17
|
+
def initialize(source, map_return_procs, query)
|
18
|
+
@source = source
|
19
|
+
@unread = true
|
20
|
+
@map_return_procs = map_return_procs
|
21
|
+
@query = query
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
@query
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Array<Symbol>] the columns in the query result
|
29
|
+
def columns
|
30
|
+
@source.columns.map { |x| x.to_sym }
|
31
|
+
end
|
32
|
+
|
33
|
+
# for the Enumerable contract
|
34
|
+
def each(&block)
|
35
|
+
raise ResultsAlreadyConsumedException unless @unread
|
36
|
+
|
37
|
+
if (block)
|
38
|
+
case @map_return_procs
|
39
|
+
when NilClass then
|
40
|
+
each_no_mapping &block
|
41
|
+
when Hash then
|
42
|
+
each_multi_column_mapping &block
|
43
|
+
else
|
44
|
+
each_single_column_mapping &block
|
45
|
+
end
|
46
|
+
else
|
47
|
+
Enumerator.new(self)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def each_no_mapping
|
55
|
+
@source.each do |row|
|
56
|
+
hash = {}
|
57
|
+
row.each do |key, value|
|
58
|
+
out[key.to_sym] = value
|
59
|
+
end
|
60
|
+
yield hash
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def each_multi_column_mapping
|
65
|
+
@source.each do |row|
|
66
|
+
hash = {}
|
67
|
+
row.each do |key, value|
|
68
|
+
k = key.to_sym
|
69
|
+
proc = @map_return_procs[k]
|
70
|
+
hash[k] = proc ? proc.call(value) : value
|
71
|
+
end
|
72
|
+
yield hash
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def each_single_column_mapping
|
77
|
+
@source.each do |row|
|
78
|
+
result = @map_return_procs.call(row.values.first)
|
79
|
+
yield result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
@@ -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
|
@@ -26,6 +26,8 @@ module Neo4j::Embedded
|
|
26
26
|
_start_node.wrapper
|
27
27
|
end
|
28
28
|
tx_methods :start_node
|
29
|
+
alias_method :_start_node_id, :start_node
|
30
|
+
tx_methods :_start_node_id
|
29
31
|
|
30
32
|
def _start_node
|
31
33
|
getStartNode
|
@@ -54,6 +56,8 @@ module Neo4j::Embedded
|
|
54
56
|
_end_node.wrapper
|
55
57
|
end
|
56
58
|
tx_methods :end_node
|
59
|
+
alias_method :_end_node_id, :end_node
|
60
|
+
tx_methods :_end_node_id
|
57
61
|
|
58
62
|
def _end_node
|
59
63
|
getEndNode
|
@@ -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
|