neo4j-core 8.1.4 → 9.0.0.alpha.1
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 +5 -5
- data/README.md +71 -8
- data/lib/neo4j-core.rb +3 -49
- data/lib/neo4j/core.rb +4 -0
- data/lib/neo4j/core/config.rb +13 -0
- data/lib/neo4j/core/cypher_session/adaptors.rb +15 -15
- data/lib/neo4j/core/cypher_session/adaptors/bolt.rb +39 -48
- data/lib/neo4j/core/cypher_session/adaptors/bolt/chunk_writer_io.rb +0 -4
- data/lib/neo4j/core/cypher_session/adaptors/bolt/pack_stream.rb +7 -3
- data/lib/neo4j/core/cypher_session/adaptors/embedded.rb +1 -2
- data/lib/neo4j/core/cypher_session/adaptors/has_uri.rb +4 -0
- data/lib/neo4j/core/cypher_session/adaptors/http.rb +1 -3
- data/lib/neo4j/core/cypher_session/responses.rb +1 -1
- data/lib/neo4j/core/cypher_session/responses/bolt.rb +0 -17
- data/lib/neo4j/core/cypher_session/responses/embedded.rb +9 -7
- data/lib/neo4j/core/cypher_session/responses/http.rb +3 -4
- data/lib/neo4j/core/cypher_session/transactions.rb +2 -0
- data/lib/{neo4j-core → neo4j/core}/helpers.rb +1 -14
- data/lib/neo4j/core/logging.rb +44 -0
- data/lib/{neo4j-core → neo4j/core}/query.rb +7 -6
- data/lib/{neo4j-core → neo4j/core}/query_clauses.rb +9 -16
- data/lib/{neo4j-core → neo4j/core}/query_find_in_batches.rb +3 -5
- data/lib/{neo4j-core → neo4j/core}/version.rb +1 -1
- data/lib/neo4j/transaction.rb +6 -8
- data/neo4j-core.gemspec +13 -11
- metadata +46 -50
- data/lib/ext/kernel.rb +0 -9
- data/lib/neo4j-core/active_entity.rb +0 -11
- data/lib/neo4j-core/label.rb +0 -9
- data/lib/neo4j-embedded.rb +0 -16
- data/lib/neo4j-embedded/cypher_response.rb +0 -71
- data/lib/neo4j-embedded/embedded_database.rb +0 -26
- data/lib/neo4j-embedded/embedded_ha_session.rb +0 -30
- data/lib/neo4j-embedded/embedded_impermanent_session.rb +0 -17
- data/lib/neo4j-embedded/embedded_label.rb +0 -88
- data/lib/neo4j-embedded/embedded_node.rb +0 -206
- data/lib/neo4j-embedded/embedded_relationship.rb +0 -77
- data/lib/neo4j-embedded/embedded_session.rb +0 -203
- data/lib/neo4j-embedded/embedded_transaction.rb +0 -30
- data/lib/neo4j-embedded/label.rb +0 -66
- data/lib/neo4j-embedded/property.rb +0 -106
- data/lib/neo4j-embedded/to_java.rb +0 -44
- data/lib/neo4j-server.rb +0 -12
- data/lib/neo4j-server/cypher_label.rb +0 -35
- data/lib/neo4j-server/cypher_node.rb +0 -221
- data/lib/neo4j-server/cypher_relationship.rb +0 -142
- data/lib/neo4j-server/cypher_response.rb +0 -248
- data/lib/neo4j-server/cypher_session.rb +0 -263
- data/lib/neo4j-server/cypher_transaction.rb +0 -100
- data/lib/neo4j-server/label.rb +0 -40
- data/lib/neo4j-server/resource.rb +0 -57
- data/lib/neo4j/entity_equality.rb +0 -8
- data/lib/neo4j/entity_marshal.rb +0 -20
- data/lib/neo4j/label.rb +0 -90
- data/lib/neo4j/node.rb +0 -216
- data/lib/neo4j/property_container.rb +0 -17
- data/lib/neo4j/property_validator.rb +0 -22
- data/lib/neo4j/relationship.rb +0 -161
- data/lib/neo4j/session.rb +0 -222
@@ -1,206 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Embedded
|
3
|
-
class RelsIterator
|
4
|
-
include Enumerable
|
5
|
-
extend Neo4j::Core::TxMethods
|
6
|
-
|
7
|
-
MARSHAL_INSTANCE_VARIABLES = %i[@node @match]
|
8
|
-
|
9
|
-
def initialize(node, match)
|
10
|
-
@node = node
|
11
|
-
::Neo4j::Node.validate_match!(match)
|
12
|
-
@match = match
|
13
|
-
end
|
14
|
-
|
15
|
-
def inspect
|
16
|
-
'Enumerable<Neo4j::Relationship>'
|
17
|
-
end
|
18
|
-
|
19
|
-
def each
|
20
|
-
@node._rels(@match).each { |r| yield(r.wrapper) }
|
21
|
-
end
|
22
|
-
tx_methods :each
|
23
|
-
|
24
|
-
def empty?
|
25
|
-
first.nil?
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
class NodesIterator
|
30
|
-
include Enumerable
|
31
|
-
extend Neo4j::Core::TxMethods
|
32
|
-
|
33
|
-
def initialize(node, match)
|
34
|
-
@node = node
|
35
|
-
@match = match
|
36
|
-
end
|
37
|
-
|
38
|
-
def inspect
|
39
|
-
'Enumerable<Neo4j::Node>'
|
40
|
-
end
|
41
|
-
|
42
|
-
def each
|
43
|
-
@node._rels(@match).each { |r| yield(r.other_node(@node)) }
|
44
|
-
end
|
45
|
-
tx_methods :each
|
46
|
-
|
47
|
-
def empty?
|
48
|
-
first.nil?
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
class EmbeddedNode < Neo4j::Node
|
53
|
-
class << self
|
54
|
-
if !Neo4j::Core::Config.using_new_session?
|
55
|
-
# This method is used to extend a Java Neo4j class so that it includes the same mixins as this class.
|
56
|
-
Java::OrgNeo4jKernelImplCore::NodeProxy.class_eval do
|
57
|
-
include Neo4j::Embedded::Property
|
58
|
-
include Neo4j::EntityEquality
|
59
|
-
include Neo4j::Core::ActiveEntity
|
60
|
-
extend Neo4j::Core::TxMethods
|
61
|
-
|
62
|
-
def inspect
|
63
|
-
"EmbeddedNode neo_id: #{neo_id}"
|
64
|
-
end
|
65
|
-
|
66
|
-
def exist?
|
67
|
-
!!graph_database.get_node_by_id(neo_id)
|
68
|
-
rescue Java::OrgNeo4jGraphdb.NotFoundException
|
69
|
-
false
|
70
|
-
end
|
71
|
-
tx_methods :exist?
|
72
|
-
|
73
|
-
def labels
|
74
|
-
_labels.iterator.map { |x| x.name.to_sym }
|
75
|
-
end
|
76
|
-
tx_methods :labels
|
77
|
-
|
78
|
-
alias_method :_labels, :getLabels
|
79
|
-
|
80
|
-
def _java_label(label_name)
|
81
|
-
Java::OrgNeo4jGraphdb.DynamicLabel.label(label_name)
|
82
|
-
end
|
83
|
-
|
84
|
-
def _add_label(*label_name)
|
85
|
-
label_name.each do |name|
|
86
|
-
addLabel(_java_label(name))
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
alias_method :add_label, :_add_label
|
91
|
-
tx_methods :add_label
|
92
|
-
|
93
|
-
def _remove_label(*label_name)
|
94
|
-
label_name.each do |name|
|
95
|
-
removeLabel(_java_label(name))
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
alias_method :remove_label, :_remove_label
|
100
|
-
tx_methods :remove_label
|
101
|
-
|
102
|
-
def set_label(*label_names)
|
103
|
-
label_as_symbols = label_names.map(&:to_sym)
|
104
|
-
to_keep = labels & label_as_symbols
|
105
|
-
to_remove = labels - to_keep
|
106
|
-
_remove_label(*to_remove)
|
107
|
-
to_add = label_as_symbols - to_keep
|
108
|
-
_add_label(*to_add)
|
109
|
-
end
|
110
|
-
tx_methods :set_label
|
111
|
-
|
112
|
-
def del
|
113
|
-
_rels.each(&:del)
|
114
|
-
delete
|
115
|
-
nil
|
116
|
-
end
|
117
|
-
tx_methods :del
|
118
|
-
tx_methods :delete
|
119
|
-
|
120
|
-
alias_method :destroy, :del
|
121
|
-
tx_methods :destroy
|
122
|
-
|
123
|
-
def create_rel(type, other_node, props = nil)
|
124
|
-
rel = create_relationship_to(other_node.neo4j_obj, ToJava.type_to_java(type))
|
125
|
-
props.each_pair { |k, v| rel[k] = v } if props
|
126
|
-
rel
|
127
|
-
end
|
128
|
-
tx_methods :create_rel
|
129
|
-
|
130
|
-
|
131
|
-
def rels(match = {})
|
132
|
-
RelsIterator.new(self, match)
|
133
|
-
end
|
134
|
-
|
135
|
-
def nodes(match = {})
|
136
|
-
NodesIterator.new(self, match)
|
137
|
-
end
|
138
|
-
|
139
|
-
def node(match = {})
|
140
|
-
rel = _rel(match)
|
141
|
-
rel && rel.other_node(self).wrapper
|
142
|
-
end
|
143
|
-
tx_methods :node
|
144
|
-
|
145
|
-
def rel?(match = {})
|
146
|
-
_rels(match).has_next
|
147
|
-
end
|
148
|
-
tx_methods :rel?
|
149
|
-
|
150
|
-
def rel(match = {})
|
151
|
-
_rel(match)
|
152
|
-
end
|
153
|
-
tx_methods :rel
|
154
|
-
|
155
|
-
def _rel(match = {})
|
156
|
-
dir, rel_type, between_id = _parse_match(match)
|
157
|
-
|
158
|
-
rel = if rel_type
|
159
|
-
get_single_relationship(rel_type, dir)
|
160
|
-
else
|
161
|
-
_get_single_relationship_by_dir(dir)
|
162
|
-
end
|
163
|
-
|
164
|
-
rel if !(rel && between_id) || rel.other_node(self).neo_id == between_id
|
165
|
-
end
|
166
|
-
|
167
|
-
def _get_single_relationship_by_dir(dir)
|
168
|
-
iter = get_relationships(dir).iterator
|
169
|
-
|
170
|
-
return nil if not iter.has_next
|
171
|
-
|
172
|
-
first = iter.next
|
173
|
-
fail ArgumentError, "Expected to only find one relationship from node #{neo_id} matching" if iter.has_next
|
174
|
-
first
|
175
|
-
end
|
176
|
-
|
177
|
-
def _rels(match = {})
|
178
|
-
dir, rel_type, between_id = _parse_match(match)
|
179
|
-
|
180
|
-
args = rel_type ? [rel_type, dir] : [dir]
|
181
|
-
rels = get_relationships(*args).iterator
|
182
|
-
|
183
|
-
if between_id
|
184
|
-
rels.find_all { |r| r.end_node.neo_id == between_id || r.start_node.neo_id == between_id }
|
185
|
-
else
|
186
|
-
rels
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def _parse_match(match)
|
191
|
-
::Neo4j::Node.validate_match!(match)
|
192
|
-
|
193
|
-
[
|
194
|
-
ToJava.dir_to_java(match[:dir] || :both),
|
195
|
-
ToJava.type_to_java(match[:type]),
|
196
|
-
match[:between] && match[:between].neo_id
|
197
|
-
]
|
198
|
-
end
|
199
|
-
|
200
|
-
include Neo4j::Node::Wrapper
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Embedded
|
3
|
-
class EmbeddedRelationship
|
4
|
-
MARSHAL_INSTANCE_VARIABLES = []
|
5
|
-
|
6
|
-
class << self
|
7
|
-
if !Neo4j::Core::Config.using_new_session?
|
8
|
-
Java::OrgNeo4jKernelImplCore::RelationshipProxy.class_eval do
|
9
|
-
include Neo4j::Embedded::Property
|
10
|
-
include Neo4j::EntityEquality
|
11
|
-
include Neo4j::Relationship::Wrapper
|
12
|
-
include Neo4j::Core::ActiveEntity
|
13
|
-
extend Neo4j::Core::TxMethods
|
14
|
-
|
15
|
-
alias_method :_other_node, :getOtherNode
|
16
|
-
|
17
|
-
def exist?
|
18
|
-
!!graph_database.get_relationship_by_id(neo_id)
|
19
|
-
rescue Java::OrgNeo4jGraphdb.NotFoundException
|
20
|
-
false
|
21
|
-
end
|
22
|
-
tx_methods :exist?
|
23
|
-
|
24
|
-
def inspect
|
25
|
-
"EmbeddedRelationship neo_id: #{neo_id}"
|
26
|
-
end
|
27
|
-
|
28
|
-
def start_node
|
29
|
-
_start_node.wrapper
|
30
|
-
end
|
31
|
-
tx_methods :start_node
|
32
|
-
alias_method :_start_node_id, :start_node
|
33
|
-
tx_methods :_start_node_id
|
34
|
-
|
35
|
-
def _start_node
|
36
|
-
getStartNode
|
37
|
-
end
|
38
|
-
|
39
|
-
def rel_type
|
40
|
-
@_rel_type ||= _rel_type
|
41
|
-
end
|
42
|
-
|
43
|
-
def _rel_type
|
44
|
-
getType.name.to_sym
|
45
|
-
end
|
46
|
-
tx_methods :rel_type
|
47
|
-
|
48
|
-
def del
|
49
|
-
delete
|
50
|
-
end
|
51
|
-
tx_methods :del
|
52
|
-
tx_methods :delete
|
53
|
-
|
54
|
-
alias_method :destroy, :del
|
55
|
-
tx_methods :destroy
|
56
|
-
|
57
|
-
def other_node(n)
|
58
|
-
_other_node(n.neo4j_obj).wrapper
|
59
|
-
end
|
60
|
-
tx_methods :other_node
|
61
|
-
|
62
|
-
def end_node
|
63
|
-
_end_node.wrapper
|
64
|
-
end
|
65
|
-
tx_methods :end_node
|
66
|
-
alias_method :_end_node_id, :end_node
|
67
|
-
tx_methods :_end_node_id
|
68
|
-
|
69
|
-
def _end_node
|
70
|
-
getEndNode
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,203 +0,0 @@
|
|
1
|
-
# Plugin
|
2
|
-
|
3
|
-
Neo4j::Session.register_db(:embedded_db) do |*args|
|
4
|
-
Neo4j::Embedded::EmbeddedSession.new(*args)
|
5
|
-
end
|
6
|
-
|
7
|
-
module Neo4j
|
8
|
-
module Embedded
|
9
|
-
class EmbeddedSession < Neo4j::Session
|
10
|
-
class Error < StandardError
|
11
|
-
end
|
12
|
-
|
13
|
-
attr_reader :graph_db, :db_location, :properties_file, :properties_map
|
14
|
-
extend Forwardable
|
15
|
-
extend Neo4j::Core::TxMethods
|
16
|
-
def_delegator :@graph_db, :begin_tx
|
17
|
-
|
18
|
-
def initialize(db_location, config = {})
|
19
|
-
@config = config
|
20
|
-
@db_location = db_location
|
21
|
-
@auto_commit = !!@config[:auto_commit]
|
22
|
-
@properties_file = @config[:properties_file]
|
23
|
-
Neo4j::Session.register(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
def properties_map
|
27
|
-
return @properties_map if @properties_map
|
28
|
-
|
29
|
-
props = if @config[:properties_map].is_a?(Hash)
|
30
|
-
@config[:properties_map].each_with_object({}) do |(k, v), m|
|
31
|
-
m[k.to_s.to_java] = v.to_s.to_java
|
32
|
-
end
|
33
|
-
else
|
34
|
-
{}
|
35
|
-
end
|
36
|
-
@properties_map = java.util.HashMap.new(props)
|
37
|
-
end
|
38
|
-
|
39
|
-
def db_type
|
40
|
-
:embedded_db
|
41
|
-
end
|
42
|
-
|
43
|
-
def inspect
|
44
|
-
"#{self.class} db_location: '#{@db_location}', running: #{running?}"
|
45
|
-
end
|
46
|
-
|
47
|
-
def version
|
48
|
-
# Wow
|
49
|
-
# Yeah, agreed...
|
50
|
-
version_string = @graph_db.to_java(Java::OrgNeo4jKernel::GraphDatabaseAPI).getDependencyResolver.resolveDependency(Java::OrgNeo4jKernel::KernelData.java_class).version.to_s
|
51
|
-
version_string.split(' ')[-1]
|
52
|
-
end
|
53
|
-
|
54
|
-
def start
|
55
|
-
fail Error, 'Embedded Neo4j db is already running' if running?
|
56
|
-
puts "Start embedded Neo4j db at #{db_location}"
|
57
|
-
factory = Java::OrgNeo4jGraphdbFactory::GraphDatabaseFactory.new
|
58
|
-
db_service = factory.newEmbeddedDatabaseBuilder(db_location)
|
59
|
-
db_service.loadPropertiesFromFile(properties_file) if properties_file
|
60
|
-
db_service.setConfig(properties_map) if properties_map
|
61
|
-
|
62
|
-
@graph_db = db_service.newGraphDatabase
|
63
|
-
Neo4j::Session._notify_listeners(:session_available, self)
|
64
|
-
@engine = Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
|
65
|
-
end
|
66
|
-
|
67
|
-
def factory_class
|
68
|
-
Java::OrgNeo4jTest::ImpermanentGraphDatabase
|
69
|
-
end
|
70
|
-
|
71
|
-
def close
|
72
|
-
super
|
73
|
-
shutdown
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.transaction_class
|
77
|
-
Neo4j::Embedded::EmbeddedTransaction
|
78
|
-
end
|
79
|
-
|
80
|
-
# Duplicate of CypherSession::Adaptor::Base#transaction
|
81
|
-
def transaction
|
82
|
-
return self.class.transaction_class.new(self) if !block_given?
|
83
|
-
|
84
|
-
begin
|
85
|
-
tx = transaction
|
86
|
-
|
87
|
-
yield tx
|
88
|
-
rescue Exception => e # rubocop:disable Lint/RescueException
|
89
|
-
tx.mark_failed
|
90
|
-
|
91
|
-
raise e
|
92
|
-
ensure
|
93
|
-
tx.close
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
def shutdown
|
98
|
-
@graph_db && @graph_db.shutdown
|
99
|
-
|
100
|
-
Neo4j::Session.clear_listeners
|
101
|
-
@graph_db = nil
|
102
|
-
end
|
103
|
-
|
104
|
-
def running?
|
105
|
-
!!@graph_db
|
106
|
-
end
|
107
|
-
|
108
|
-
def create_label(name)
|
109
|
-
EmbeddedLabel.new(self, name)
|
110
|
-
end
|
111
|
-
|
112
|
-
def load_node(neo_id)
|
113
|
-
_load_node(neo_id)
|
114
|
-
end
|
115
|
-
tx_methods :load_node
|
116
|
-
|
117
|
-
# Same as load but does not return the node as a wrapped Ruby object.
|
118
|
-
#
|
119
|
-
def _load_node(neo_id)
|
120
|
-
return nil if neo_id.nil?
|
121
|
-
@graph_db.get_node_by_id(neo_id.to_i)
|
122
|
-
rescue Java::OrgNeo4jGraphdb.NotFoundException
|
123
|
-
nil
|
124
|
-
end
|
125
|
-
|
126
|
-
def load_relationship(neo_id)
|
127
|
-
_load_relationship(neo_id)
|
128
|
-
end
|
129
|
-
tx_methods :load_relationship
|
130
|
-
|
131
|
-
def _load_relationship(neo_id)
|
132
|
-
return nil if neo_id.nil?
|
133
|
-
@graph_db.get_relationship_by_id(neo_id.to_i)
|
134
|
-
rescue Java::OrgNeo4jGraphdb.NotFoundException
|
135
|
-
nil
|
136
|
-
end
|
137
|
-
|
138
|
-
def query(*args)
|
139
|
-
if [[String], [String, Hash]].include?(args.map(&:class))
|
140
|
-
query, params = args[0, 2]
|
141
|
-
Neo4j::Embedded::ResultWrapper.new(_query(query, params), query)
|
142
|
-
else
|
143
|
-
options = args[0] || {}
|
144
|
-
Neo4j::Core::Query.new(options.merge(session: self))
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
def find_all_nodes(label)
|
150
|
-
EmbeddedLabel.new(self, label).find_nodes
|
151
|
-
end
|
152
|
-
|
153
|
-
def find_nodes(label, key, value)
|
154
|
-
EmbeddedLabel.new(self, label).find_nodes(key, value)
|
155
|
-
end
|
156
|
-
|
157
|
-
# Performs a cypher query with given string.
|
158
|
-
# Remember that you should close the resource iterator.
|
159
|
-
# @param [String] q the cypher query as a String
|
160
|
-
# @return (see #query)
|
161
|
-
def _query(query, params = {}, options = {})
|
162
|
-
ActiveSupport::Notifications.instrument('neo4j.cypher_query', params: params, context: options[:context],
|
163
|
-
cypher: query, pretty_cypher: options[:pretty_cypher], params: params) do
|
164
|
-
@engine ||= Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
|
165
|
-
@engine.execute(query, indifferent_params(params))
|
166
|
-
end
|
167
|
-
rescue StandardError => e
|
168
|
-
raise Neo4j::Session::CypherError.new(e.message, e.class, 'cypher error')
|
169
|
-
end
|
170
|
-
|
171
|
-
def indifferent_params(params)
|
172
|
-
return {} unless params
|
173
|
-
params.each { |k, v| params[k] = HashWithIndifferentAccess.new(params[k]) if v.is_a?(Hash) && !v.respond_to?(:nested_under_indifferent_access) }
|
174
|
-
HashWithIndifferentAccess.new(params)
|
175
|
-
end
|
176
|
-
|
177
|
-
def query_default_return(as)
|
178
|
-
" RETURN #{as}"
|
179
|
-
end
|
180
|
-
|
181
|
-
def _query_or_fail(q)
|
182
|
-
@engine ||= Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
|
183
|
-
@engine.execute(q)
|
184
|
-
end
|
185
|
-
|
186
|
-
def search_result_to_enumerable(result)
|
187
|
-
result.map { |column| column['n'].wrapper }
|
188
|
-
end
|
189
|
-
|
190
|
-
def create_node(properties = nil, labels = [])
|
191
|
-
if labels.empty?
|
192
|
-
@graph_db.create_node
|
193
|
-
else
|
194
|
-
labels = EmbeddedLabel.as_java(labels)
|
195
|
-
@graph_db.create_node(labels)
|
196
|
-
end.tap do |java_node|
|
197
|
-
properties.each_pair { |k, v| java_node[k] = v } if properties
|
198
|
-
end
|
199
|
-
end
|
200
|
-
tx_methods :create_node
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|