neo4j-core 5.0.10 → 5.1.0.rc.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 +4 -4
- data/Gemfile +0 -4
- data/README.md +32 -6
- data/lib/neo4j-core.rb +0 -1
- data/lib/neo4j-core/helpers.rb +2 -7
- data/lib/neo4j-core/query.rb +19 -5
- data/lib/neo4j-core/query_clauses.rb +123 -35
- data/lib/neo4j-core/version.rb +1 -1
- data/lib/neo4j-embedded.rb +1 -1
- data/lib/neo4j-embedded/embedded_session.rb +15 -9
- data/lib/neo4j-server.rb +0 -1
- data/lib/neo4j-server/cypher_node.rb +8 -6
- data/lib/neo4j-server/cypher_relationship.rb +11 -5
- data/lib/neo4j-server/cypher_response.rb +9 -6
- data/lib/neo4j-server/cypher_session.rb +20 -14
- data/lib/neo4j-server/cypher_transaction.rb +0 -1
- data/lib/neo4j/label.rb +0 -1
- data/lib/neo4j/node.rb +6 -1
- data/neo4j-core.gemspec +1 -2
- metadata +8 -27
- data/lib/neo4j-core/cypher_translator.rb +0 -76
- data/lib/neo4j-core/hash_with_indifferent_access.rb +0 -174
- data/lib/neo4j-server/cypher_node_uncommited.rb +0 -14
- data/lib/neo4j/tasks/config_server.rb +0 -36
- data/lib/neo4j/tasks/neo4j_server.rake +0 -258
data/lib/neo4j-core/version.rb
CHANGED
data/lib/neo4j-embedded.rb
CHANGED
@@ -13,4 +13,4 @@ require 'neo4j-embedded/embedded_transaction'
|
|
13
13
|
require 'neo4j-embedded/cypher_response'
|
14
14
|
|
15
15
|
# TODO: replace this with https://github.com/intridea/hashie gem
|
16
|
-
require '
|
16
|
+
require 'active_support/hash_with_indifferent_access'
|
@@ -4,7 +4,6 @@ Neo4j::Session.register_db(:embedded_db) do |*args|
|
|
4
4
|
Neo4j::Embedded::EmbeddedSession.new(*args)
|
5
5
|
end
|
6
6
|
|
7
|
-
|
8
7
|
module Neo4j
|
9
8
|
module Embedded
|
10
9
|
class EmbeddedSession < Neo4j::Session
|
@@ -17,16 +16,22 @@ module Neo4j
|
|
17
16
|
def_delegator :@graph_db, :begin_tx
|
18
17
|
|
19
18
|
def initialize(db_location, config = {})
|
19
|
+
@config = config
|
20
20
|
@db_location = db_location
|
21
|
-
@auto_commit =
|
22
|
-
@properties_file = config[:properties_file]
|
23
|
-
if config[:properties_map]
|
24
|
-
props = config[:properties_map].each_with_object({}) { |(k, v), m| m[k.to_s.to_java] = v.to_s.to_java }
|
25
|
-
@properties_map = java.util.HashMap.new(props)
|
26
|
-
end
|
21
|
+
@auto_commit = !!@config[:auto_commit]
|
22
|
+
@properties_file = @config[:properties_file]
|
27
23
|
Neo4j::Session.register(self)
|
28
24
|
end
|
29
25
|
|
26
|
+
def properties_map
|
27
|
+
return @properties_map if @properties_map
|
28
|
+
|
29
|
+
props = @config[:properties_map].each_with_object({}) do |(k, v), m|
|
30
|
+
m[k.to_s.to_java] = v.to_s.to_java
|
31
|
+
end
|
32
|
+
@properties_map = java.util.HashMap.new(props)
|
33
|
+
end
|
34
|
+
|
30
35
|
def db_type
|
31
36
|
:embedded_db
|
32
37
|
end
|
@@ -138,9 +143,10 @@ module Neo4j
|
|
138
143
|
# @param [String] q the cypher query as a String
|
139
144
|
# @return (see #query)
|
140
145
|
def _query(query, params = {}, options = {})
|
141
|
-
ActiveSupport::Notifications.instrument('neo4j.cypher_query', context: options[:context]
|
146
|
+
ActiveSupport::Notifications.instrument('neo4j.cypher_query', params: params, context: options[:context],
|
147
|
+
cypher: query, pretty_cypher: options[:pretty_cypher], params: params) do
|
142
148
|
@engine ||= Java::OrgNeo4jCypherJavacompat::ExecutionEngine.new(@graph_db)
|
143
|
-
@engine.execute(query,
|
149
|
+
@engine.execute(query, HashWithIndifferentAccess.new(params))
|
144
150
|
end
|
145
151
|
rescue StandardError => e
|
146
152
|
raise Neo4j::Session::CypherError.new(e.message, e.class, 'cypher error')
|
data/lib/neo4j-server.rb
CHANGED
@@ -7,7 +7,6 @@ require 'neo4j-server/cypher_node'
|
|
7
7
|
require 'neo4j-server/cypher_label'
|
8
8
|
require 'neo4j-server/label'
|
9
9
|
require 'neo4j-server/cypher_session'
|
10
|
-
require 'neo4j-server/cypher_node_uncommited'
|
11
10
|
require 'neo4j-server/cypher_relationship'
|
12
11
|
require 'neo4j-server/cypher_response'
|
13
12
|
require 'neo4j-server/cypher_transaction'
|
@@ -2,7 +2,6 @@ module Neo4j
|
|
2
2
|
module Server
|
3
3
|
class CypherNode < Neo4j::Node
|
4
4
|
include Neo4j::Server::Resource
|
5
|
-
include Neo4j::Core::CypherTranslator
|
6
5
|
include Neo4j::Core::ActiveEntity
|
7
6
|
|
8
7
|
def initialize(session, value)
|
@@ -113,8 +112,6 @@ module Neo4j
|
|
113
112
|
end
|
114
113
|
|
115
114
|
def set_label(*label_names)
|
116
|
-
q = match_start_query
|
117
|
-
|
118
115
|
labels_to_add = label_names.map(&:to_sym).uniq
|
119
116
|
labels_to_remove = labels - label_names
|
120
117
|
|
@@ -122,10 +119,15 @@ module Neo4j
|
|
122
119
|
labels_to_add -= common_labels
|
123
120
|
labels_to_remove -= common_labels
|
124
121
|
|
125
|
-
|
126
|
-
|
122
|
+
query = _set_label_query(labels_to_add, labels_to_remove)
|
123
|
+
@session._query_or_fail(query, false) unless (labels_to_add + labels_to_remove).empty?
|
124
|
+
end
|
127
125
|
|
128
|
-
|
126
|
+
def _set_label_query(labels_to_add, labels_to_remove)
|
127
|
+
query = match_start_query
|
128
|
+
query = query.remove(n: labels_to_remove) unless labels_to_remove.empty?
|
129
|
+
query = query.set(n: labels_to_add) unless labels_to_add.empty?
|
130
|
+
query
|
129
131
|
end
|
130
132
|
|
131
133
|
# (see Neo4j::Node#del)
|
@@ -2,7 +2,6 @@ module Neo4j
|
|
2
2
|
module Server
|
3
3
|
class CypherRelationship < Neo4j::Relationship
|
4
4
|
include Neo4j::Server::Resource
|
5
|
-
include Neo4j::Core::CypherTranslator
|
6
5
|
include Neo4j::Core::ActiveEntity
|
7
6
|
|
8
7
|
def initialize(session, value)
|
@@ -93,10 +92,17 @@ module Neo4j
|
|
93
92
|
# (see Neo4j::Relationship#update_props)
|
94
93
|
def update_props(properties)
|
95
94
|
return if properties.empty?
|
96
|
-
|
97
|
-
|
95
|
+
|
96
|
+
params = {}
|
97
|
+
q = "#{match_start} SET " + properties.keys.each_with_index.map do |k, _i|
|
98
|
+
param = k.to_s.tr_s('^a-zA-Z0-9', '_').gsub(/^_+|_+$/, '')
|
99
|
+
params[param] = properties[k]
|
100
|
+
|
101
|
+
"n.`#{k}`= {#{param}}"
|
98
102
|
end.join(',')
|
99
|
-
|
103
|
+
|
104
|
+
@session._query_or_fail(q, false, params.merge(neo_id: neo_id))
|
105
|
+
|
100
106
|
properties
|
101
107
|
end
|
102
108
|
|
@@ -127,7 +133,7 @@ module Neo4j
|
|
127
133
|
end
|
128
134
|
|
129
135
|
def neo_id_integer(id_or_url)
|
130
|
-
id_or_url.is_a?(Integer) ? id_or_url : id_or_url.
|
136
|
+
id_or_url.is_a?(Integer) ? id_or_url : id_or_url.split('/').last.to_i
|
131
137
|
end
|
132
138
|
end
|
133
139
|
end
|
@@ -13,6 +13,7 @@ module Neo4j
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
class ConstraintViolationError < ResponseError; end
|
16
17
|
|
17
18
|
class HashEnumeration
|
18
19
|
include Enumerable
|
@@ -201,9 +202,15 @@ module Neo4j
|
|
201
202
|
self
|
202
203
|
end
|
203
204
|
|
205
|
+
CONSTRAINT_ERROR = 'Neo.ClientError.Schema.ConstraintViolation'
|
204
206
|
def raise_error
|
205
207
|
fail 'Tried to raise error without an error' unless @error
|
206
|
-
|
208
|
+
error_class = constraint_error? ? ConstraintViolationError : ResponseError
|
209
|
+
fail error_class.new(@error_msg, @error_status, @error_code)
|
210
|
+
end
|
211
|
+
|
212
|
+
def constraint_error?
|
213
|
+
@error_code == CONSTRAINT_ERROR || @error_msg.include?('already exists with')
|
207
214
|
end
|
208
215
|
|
209
216
|
def raise_cypher_error
|
@@ -228,11 +235,7 @@ module Neo4j
|
|
228
235
|
|
229
236
|
new(response, true).tap do |cr|
|
230
237
|
body = response.body
|
231
|
-
|
232
|
-
cr.set_data(body[:results].first)
|
233
|
-
else
|
234
|
-
cr.set_error(body[:errors].first)
|
235
|
-
end
|
238
|
+
body[:errors].empty? ? cr.set_data(body[:results].first) : cr.set_error(body[:errors].first)
|
236
239
|
end
|
237
240
|
end
|
238
241
|
|
@@ -8,7 +8,6 @@ module Neo4j
|
|
8
8
|
|
9
9
|
class CypherSession < Neo4j::Session
|
10
10
|
include Resource
|
11
|
-
include Neo4j::Core::CypherTranslator
|
12
11
|
|
13
12
|
alias_method :super_query, :query
|
14
13
|
attr_reader :connection
|
@@ -102,9 +101,14 @@ module Neo4j
|
|
102
101
|
end
|
103
102
|
|
104
103
|
def create_node(props = nil, labels = [])
|
105
|
-
|
106
|
-
|
107
|
-
|
104
|
+
label_string = labels.empty? ? '' : (':' + labels.map { |k| "`#{k}`" }.join(':'))
|
105
|
+
if !props.nil?
|
106
|
+
prop = '{props}'
|
107
|
+
props.each_key { |k| props.delete(k) if props[k].nil? }
|
108
|
+
end
|
109
|
+
|
110
|
+
id = _query_or_fail("CREATE (n#{label_string} #{prop}) RETURN ID(n)", true, props: props)
|
111
|
+
CypherNode.new(self, props.nil? ? id : {id: id, metadata: {labels: labels}, data: props})
|
108
112
|
end
|
109
113
|
|
110
114
|
def load_node(neo_id)
|
@@ -114,11 +118,9 @@ module Neo4j
|
|
114
118
|
def load_relationship(neo_id)
|
115
119
|
query.unwrapped.optional_match('(n)-[r]-()').where(r: {neo_id: neo_id}).pluck(:r).first
|
116
120
|
rescue Neo4j::Session::CypherError => cypher_error
|
117
|
-
if cypher_error.message.match(/not found$/)
|
118
|
-
|
119
|
-
|
120
|
-
raise cypher_error
|
121
|
-
end
|
121
|
+
return nil if cypher_error.message.match(/not found$/)
|
122
|
+
|
123
|
+
raise cypher_error
|
122
124
|
end
|
123
125
|
|
124
126
|
def create_label(name)
|
@@ -206,13 +208,15 @@ module Neo4j
|
|
206
208
|
query, params = query_and_params(query, params)
|
207
209
|
|
208
210
|
curr_tx = Neo4j::Transaction.current
|
209
|
-
|
211
|
+
puts options[:pretty_cypher]
|
212
|
+
puts
|
213
|
+
ActiveSupport::Notifications.instrument('neo4j.cypher_query', params: params, context: options[:context],
|
214
|
+
cypher: query, pretty_cypher: options[:pretty_cypher]) do
|
210
215
|
if curr_tx
|
211
216
|
curr_tx._query(query, params)
|
212
217
|
else
|
213
|
-
url = resource_url(:cypher)
|
214
218
|
query = params.nil? ? {'query' => query} : {'query' => query, 'params' => params}
|
215
|
-
response = @connection.post(
|
219
|
+
response = @connection.post(resource_url(:cypher), query)
|
216
220
|
CypherResponse.create_with_no_tx(response)
|
217
221
|
end
|
218
222
|
end
|
@@ -235,12 +239,14 @@ module Neo4j
|
|
235
239
|
end
|
236
240
|
|
237
241
|
EMPTY = ''
|
242
|
+
NEWLINE_W_SPACES = "\n "
|
238
243
|
def self.log_with
|
239
|
-
clear, yellow, cyan = %W(\e[0m \e[33m \e[36m)
|
240
244
|
ActiveSupport::Notifications.subscribe('neo4j.cypher_query') do |_, start, finish, _id, payload|
|
241
245
|
ms = (finish - start) * 1000
|
242
246
|
params_string = (payload[:params] && payload[:params].size > 0 ? "| #{payload[:params].inspect}" : EMPTY)
|
243
|
-
|
247
|
+
cypher = payload[:pretty_cypher] ? NEWLINE_W_SPACES + payload[:pretty_cypher].gsub(/\n/, NEWLINE_W_SPACES) : payload[:cypher]
|
248
|
+
|
249
|
+
yield(" #{ANSI::CYAN}#{payload[:context] || 'CYPHER'}#{ANSI::CLEAR} #{ANSI::YELLOW}#{ms.round}ms#{ANSI::CLEAR} #{cypher} #{params_string}")
|
244
250
|
end
|
245
251
|
end
|
246
252
|
end
|
@@ -9,7 +9,6 @@ module Neo4j
|
|
9
9
|
# If a transaction is created and then closed without performing any queries, an OpenStruct is returned that behaves like a successfully closed query.
|
10
10
|
class CypherTransaction
|
11
11
|
include Neo4j::Transaction::Instance
|
12
|
-
include Neo4j::Core::CypherTranslator
|
13
12
|
include Resource
|
14
13
|
|
15
14
|
attr_reader :commit_url, :query_url, :base_url, :connection
|
data/lib/neo4j/label.rb
CHANGED
data/lib/neo4j/node.rb
CHANGED
@@ -168,7 +168,12 @@ module Neo4j
|
|
168
168
|
class << self
|
169
169
|
# Creates a node
|
170
170
|
def create(props = nil, *labels_or_db)
|
171
|
-
session = Neo4j::
|
171
|
+
session = if labels_or_db.last.is_a?(Neo4j::Session)
|
172
|
+
labels_or_db.pop
|
173
|
+
else
|
174
|
+
Neo4j::Session.current!
|
175
|
+
end
|
176
|
+
|
172
177
|
session.create_node(props, labels_or_db)
|
173
178
|
end
|
174
179
|
|
data/neo4j-core.gemspec
CHANGED
@@ -30,11 +30,10 @@ Neo4j-core provides classes and methods to work with the graph database Neo4j.
|
|
30
30
|
s.add_dependency('httpclient')
|
31
31
|
s.add_dependency('faraday_middleware', '~> 0.9.1')
|
32
32
|
s.add_dependency('json')
|
33
|
-
s.add_dependency('os') # for Rake task
|
34
|
-
s.add_dependency('zip') # for Rake task
|
35
33
|
s.add_dependency('activesupport') # For ActiveSupport::Notifications
|
36
34
|
s.add_dependency('multi_json')
|
37
35
|
s.add_dependency('faraday_middleware-multi_json')
|
36
|
+
s.add_dependency('neo4j-rake_tasks')
|
38
37
|
|
39
38
|
s.add_development_dependency('pry')
|
40
39
|
s.add_development_dependency('yard')
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.1.0.rc.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andreas Ronge, Chris Grigg, Brian Underwood
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -95,21 +95,7 @@ dependencies:
|
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :runtime
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: zip
|
98
|
+
name: activesupport
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
101
|
- - ">="
|
@@ -123,7 +109,7 @@ dependencies:
|
|
123
109
|
- !ruby/object:Gem::Version
|
124
110
|
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
112
|
+
name: multi_json
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
128
114
|
requirements:
|
129
115
|
- - ">="
|
@@ -137,7 +123,7 @@ dependencies:
|
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '0'
|
139
125
|
- !ruby/object:Gem::Dependency
|
140
|
-
name: multi_json
|
126
|
+
name: faraday_middleware-multi_json
|
141
127
|
requirement: !ruby/object:Gem::Requirement
|
142
128
|
requirements:
|
143
129
|
- - ">="
|
@@ -151,7 +137,7 @@ dependencies:
|
|
151
137
|
- !ruby/object:Gem::Version
|
152
138
|
version: '0'
|
153
139
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
140
|
+
name: neo4j-rake_tasks
|
155
141
|
requirement: !ruby/object:Gem::Requirement
|
156
142
|
requirements:
|
157
143
|
- - ">="
|
@@ -261,8 +247,6 @@ files:
|
|
261
247
|
- lib/ext/kernel.rb
|
262
248
|
- lib/neo4j-core.rb
|
263
249
|
- lib/neo4j-core/active_entity.rb
|
264
|
-
- lib/neo4j-core/cypher_translator.rb
|
265
|
-
- lib/neo4j-core/hash_with_indifferent_access.rb
|
266
250
|
- lib/neo4j-core/helpers.rb
|
267
251
|
- lib/neo4j-core/label.rb
|
268
252
|
- lib/neo4j-core/query.rb
|
@@ -285,7 +269,6 @@ files:
|
|
285
269
|
- lib/neo4j-server.rb
|
286
270
|
- lib/neo4j-server/cypher_label.rb
|
287
271
|
- lib/neo4j-server/cypher_node.rb
|
288
|
-
- lib/neo4j-server/cypher_node_uncommited.rb
|
289
272
|
- lib/neo4j-server/cypher_relationship.rb
|
290
273
|
- lib/neo4j-server/cypher_response.rb
|
291
274
|
- lib/neo4j-server/cypher_session.rb
|
@@ -300,8 +283,6 @@ files:
|
|
300
283
|
- lib/neo4j/property_validator.rb
|
301
284
|
- lib/neo4j/relationship.rb
|
302
285
|
- lib/neo4j/session.rb
|
303
|
-
- lib/neo4j/tasks/config_server.rb
|
304
|
-
- lib/neo4j/tasks/neo4j_server.rake
|
305
286
|
- lib/neo4j/transaction.rb
|
306
287
|
- neo4j-core.gemspec
|
307
288
|
homepage: https://github.com/neo4jrb/neo4j-core
|
@@ -326,9 +307,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
326
307
|
version: 1.9.3
|
327
308
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
328
309
|
requirements:
|
329
|
-
- - "
|
310
|
+
- - ">"
|
330
311
|
- !ruby/object:Gem::Version
|
331
|
-
version:
|
312
|
+
version: 1.3.1
|
332
313
|
requirements: []
|
333
314
|
rubyforge_project:
|
334
315
|
rubygems_version: 2.4.5
|
@@ -1,76 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Core
|
3
|
-
module CypherTranslator
|
4
|
-
# Cypher Helper
|
5
|
-
def escape_value(value)
|
6
|
-
if value.is_a?(String) || value.is_a?(Symbol)
|
7
|
-
"'#{escape_quotes(sanitize_escape_sequences(value.to_s))}'"
|
8
|
-
else
|
9
|
-
value
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
# Like escape_value but it does not wrap the value in quotes
|
14
|
-
def create_escape_value(value)
|
15
|
-
if value.is_a?(String) || value.is_a?(Symbol)
|
16
|
-
"#{sanitize_escape_sequences(value.to_s)}"
|
17
|
-
else
|
18
|
-
value
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
# Only following escape sequence characters are allowed in Cypher:
|
23
|
-
#
|
24
|
-
# \t Tab
|
25
|
-
# \b Backspace
|
26
|
-
# \n Newline
|
27
|
-
# \r Carriage return
|
28
|
-
# \f Form feed
|
29
|
-
# \' Single quote
|
30
|
-
# \" Double quote
|
31
|
-
# \\ Backslash
|
32
|
-
#
|
33
|
-
# From:
|
34
|
-
# http://docs.neo4j.org/chunked/stable/cypher-expressions.html#_note_on_string_literals
|
35
|
-
SANITIZE_ESCAPED_REGEXP = /(?<!\\)\\(\\\\)*(?![futbnr'"\\])/
|
36
|
-
EMPTY_PROPS = ''
|
37
|
-
|
38
|
-
def sanitize_escape_sequences(s)
|
39
|
-
s.gsub SANITIZE_ESCAPED_REGEXP, EMPTY_PROPS
|
40
|
-
end
|
41
|
-
|
42
|
-
def escape_quotes(s)
|
43
|
-
s.gsub("'", %q(\\\'))
|
44
|
-
end
|
45
|
-
|
46
|
-
# Cypher Helper
|
47
|
-
def cypher_prop_list!(props)
|
48
|
-
return nil unless props
|
49
|
-
props.reject! { |_, v| v.nil? }
|
50
|
-
{props: props.each { |k, v| props[k] = create_escape_value(v) }}
|
51
|
-
end
|
52
|
-
|
53
|
-
# Stolen from keymaker
|
54
|
-
# https://github.com/therubymug/keymaker/blob/master/lib/keymaker/parsers/cypher_response_parser.rb
|
55
|
-
def self.translate_response(response_body, result)
|
56
|
-
Hashie::Mash.new(Hash[sanitized_column_names(response_body).zip(result)])
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.sanitized_column_names(response_body)
|
60
|
-
response_body.columns.map { |column| column[/[^\.]+$/] }
|
61
|
-
end
|
62
|
-
|
63
|
-
def cypher_string(labels, props)
|
64
|
-
"CREATE (n#{label_string(labels)} #{prop_identifier(props)}) RETURN ID(n)"
|
65
|
-
end
|
66
|
-
|
67
|
-
def label_string(labels)
|
68
|
-
labels.empty? ? '' : ":#{labels.map { |k| "`#{k}`" }.join(':')}"
|
69
|
-
end
|
70
|
-
|
71
|
-
def prop_identifier(props)
|
72
|
-
'{props}' unless props.nil?
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|