Ниже приведен драгоценный камень, который я использую
gem 'neo4j', github: 'andreasronge/neo4j
и ниже представлены модель пользователя и друга:
Пользователь.rb
class User
include Neo4j::ActiveNode
property :name, :type => String, :index => :exact
property :mood, :type => String
property :status, :type => String
property :dob, :type => DateTime, :index => :exact
property :uid, :type => String, :index => :exact, :unique => true
property :username, :type => String
property :email, :type => String, :index => :exact
property :gender, :type => String, :index => :exact
property :remember_token, :type => String, :index => :exact
property :fb_access_token, :type => String, :index => :exact
scope :gender_filter, ->(g){ where(gender: g)}
property :friends_list
serialize :friends_list
#before_save :create_remember_token
validates :email, :uniqueness => true
has_many :both, :friends, model_class: User, rel_class: Friend
has_many :both, :friend_girls, model_class: User, rel_class: Friend_girl
has_many :both, :friend_boys, model_class: User, rel_class: Friend_boy
has_many :both, :places, model_class: Location, rel_class: Place
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
Друг.рб
class Friend
include Neo4j::ActiveRel
property :provider, :type => String
from_class User
to_class User
type 'friends'
end
Ниже приведены журналы консоли для выполнения запроса:
CYPHER 1022ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1
User#friend_boys 1077ms MATCH (user0:`User`), (result:`User`), user0-[rel0:`friend_boys` {_classname: "Friend_boy"}]-(result:`User`) WHERE ID(user0) = 0 RETURN resu
lt LIMIT 8
Rendered users/_list.html.erb (7425.9ms)
Rendered users/friends.html.erb within layouts/application (7456.0ms)
Rendered layouts/_shim.html.erb (1.0ms)
User#places 1063ms MATCH (user0:`User`), (result:`Location`), user0-[rel0:`places` {_classname: "Place"}]-(result:`Location`) WHERE ID(user0) = 0 RETURN result
Rendered layouts/_header.html.erb (25855.1ms)
Rendered layouts/_sidebar.html.erb (3.0ms)
Completed 200 OK in 36067ms (Views: 33981.5ms)
Но те же отдельные запросы занимают около 350 мс в консоли администратора Neo4j.
Я использую версию neo4j-commnunity 2.1.3.
Пожалуйста, помогите мне с производительностью, так как это слишком медленно по сравнению с другими базами данных.
Обновление 1:
Как было предложено, я стер каталог данных и переустановил neo4j-community (2.1.3), но ничего не изменилось, производительность по-прежнему была низкой, поэтому я решил установить новую версию neo4j-community (2.1.5), сохранив существующий каталог данных. -место, опять те же результаты. Затем я удалил каталог данных и снова установил neo4j-community (2.1.5), на этот раз я получил лучшую производительность для некоторых запросов в моем приложении rails по сравнению с более чем 1000 мс для всех запросов в моей предыдущей настройке.
Ниже приведены журналы:
Экземпляр 1:
CYPHER 2025ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}
CYPHER 16ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>171, :result_email=>"[email protected]"}
Пример 2:
CYPHER 15ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}
User#friend_girls 25ms MATCH (user171:`User`), (result:`User`), user171-[rel0:`friend_girls`]-(result:`User`) WHERE ID(user171) = {ID_user171_} RETURN result LIMIT 8 | {:ID_user171_=>171}
В экземпляре 1:
Как вы можете видеть, для второго запроса потребовалось всего 16 мс по сравнению с моими предыдущими попытками настройки, которые всегда занимали более 1000 мс.
Но для первого запроса производительность слишком низкая, более 2 секунд.
В экземпляре 2:
Тот же запрос, который занял более 2 секунд, теперь занял 15 мс (вероятно, запрос кэшируется). но это непоследовательно, для последовательного выполнения одного и того же запроса иногда требуется более 2 секунд, а иногда менее 20 мс.
В экземпляре 3:
CYPHER 1033ms MATCH (n:`Location`) WHERE n.address = {n_address} RETURN n LIMIT 1 | {:n_address=>"Vijayanagar, Karnataka, India"}
CYPHER 14ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"dZGEOm0aKxDYkIQ5PfGjnw"}
CYPHER 90ms START start = node(171), end = node(173) CREATE start-[rel0:`places` {_classname: "Place"}]->end
CYPHER 16ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>171, :result_email=>"[email protected]"}
User#places 59ms MATCH (user171:`User`), (result:`Location`), user171-[rel0:`places`]-(result:`Location`) WHERE ID(user171) = {ID_user171_} RETURN count(result) AS count | {:ID_user171_=>171}
User#places 14ms MATCH (user171:`User`), (result:`Location`), user171-[rel0:`places`]-(result:`Location`) WHERE ID(user171) = {ID_user171_} RETURN result | {:ID_user171_=>171}
В экземпляре 3 мы можем заметить, что только первый запрос медленный, все остальные запросы быстрые.
Обновление 2:
Ниже лог после bundle update
Started GET "/" for 127.0.0.1 at 2014-10-28 08:14:26 +0530
Processing by StaticPagesController#home as HTML
CYPHER 1030ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
Rendered users/_default_pic.html.erb (3.0ms)
Rendered users/_pics_grid.html.erb (4.0ms)
User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN count(result) AS c
ount | {:ID_user184_=>184}
Rendered users/_places.html.erb (17.0ms)
Rendered users/_my_badges.html.erb (1.0ms)
Rendered users/_profile_pics.html.erb (0.0ms)
Rendered users/_show.html.erb (200.1ms)
Rendered static_pages/home.html.erb within layouts/application (204.2ms)
Rendered layouts/_shim.html.erb (0.0ms)
User#places 0ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN result | {:ID_user
184_=>184}
Rendered layouts/_header.html.erb (499.6ms)
Rendered layouts/_sidebar.html.erb (3.0ms)
Completed 200 OK in 2100ms (Views: 1064.7ms)
Started GET "/" for 127.0.0.1 at 2014-10-28 08:14:35 +0530
Processing by StaticPagesController#home as HTML
CYPHER 2036ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
Rendered users/_default_pic.html.erb (2.0ms)
Rendered users/_pics_grid.html.erb (0.0ms)
User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN count(result) AS c
ount | {:ID_user184_=>184}
Rendered users/_places.html.erb (14.0ms)
Rendered users/_my_badges.html.erb (0.0ms)
Rendered users/_profile_pics.html.erb (17.9ms)
Rendered users/_show.html.erb (221.0ms)
Rendered static_pages/home.html.erb within layouts/application (226.1ms)
Rendered layouts/_shim.html.erb (0.0ms)
User#places 5ms MATCH (user184:`User`), (result:`Location`), user184-[rel0:`places`]-(result:`Location`) WHERE ID(user184) = {ID_user184_} RETURN result | {:ID_user
184_=>184}
Rendered layouts/_header.html.erb (474.4ms)
Rendered layouts/_sidebar.html.erb (1.0ms)
Completed 200 OK in 3094ms (Views: 1053.2ms)
Started GET "/assets/xeditable/img/loading.gif" for 127.0.0.1 at 2014-10-28 08:15:57 +0530
Started POST "/users/de30de56-7898-4d6b-8be4-c18a0c4915d6/update_status" for 127.0.0.1 at 2014-10-28 08:16:15 +0530
Processing by UsersController#update_status as JSON
Parameters: {"name"=>"xe_status", "value"=>"i am doing good", "pk"=>"1", "id"=>"de30de56-7898-4d6b-8be4-c18a0c4915d6"}
CYPHER 1016ms MATCH (n:`User`) WHERE n.remember_token = {n_remember_token} RETURN n LIMIT 1 | {:n_remember_token=>"xqbwLZFzaULDZUKihEql5Q"}
CYPHER 26ms MATCH (result:`User`) WHERE result.email = {result_email} AND NOT ID(result) = {record_neo_id} RETURN COUNT(result) AS count | {:record_neo_id=>184, :re
sult_email=>"[email protected]"}
Completed 200 OK in 1305ms (Views: 1.0ms)
Gemfile
source 'https://rubygems.org'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.2'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'
# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'
group :doc do
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', require: false
end
gem "will_paginate"
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data'
gem 'omniauth-facebook'
gem "geocoder"
gem 'rails4-autocomplete'
gem "font-awesome-rails"
gem 'koala'
gem 'newrelic_rpm'
gem 'jquery-turbolinks'
group :production do
gem 'rails_12factor'
end
gem 'jquery-ui-rails'
gem "string-urlize" # for making the title the primary key and work as an URL, see Neo4j.rb id_property
platforms :jruby do
gem 'neo4j-community', '~> 2.0.0'
end
gem 'sidekiq'
gem 'sinatra', require: false
gem 'slim'
gem 'neo4j'
gem 'cloudinary'
group :development do
gem 'spring'
gem 'os'
gem 'better_errors'
gem 'binding_of_caller'
gem 'meta_request'
gem 'debugger'
gem 'foreman'
end
Ruby version is 2.0.0 and Rails version is 4.0.2
{_classname}
из каждого запроса ActiveRel, но мы еще не выпустили новую версию для Rubygems. - person subvertallchris   schedule 18.10.2014bundle update neo4j
, вчера мы выпустили новую версию с множеством исправлений производительности. Ничего, что могло бы объяснить это, я не думаю, но это может только помочь. - person subvertallchris   schedule 25.10.2014bundle update
оно решило нашу первоначальную проблему более 1000 мс для всех запросов на всех наших машинах. Но проблема более 1000 мс для первого запроса в каждом запросе все еще существует. см. обновление 2 для журналов. Я также обновил свой gemfile, спасибо. - person achalbi   schedule 28.10.2014bundle update
? - person subvertallchris   schedule 28.10.2014rails c
и выполнитеUser.find_by(remember_token: 'xqbwLZFzaULDZUKihEql5Q')
, сколько времени пройдет после первого запроса, который устанавливает сеанс с базой данных? - person subvertallchris   schedule 28.10.2014Benchmark.ms { User.find_by(remember_token: 'xqbwLZFzaULDZUKihEql5Q') }
вrails c
заняло более 2000 мс. - person achalbi   schedule 28.10.2014gem 'neo4j-core', git: '[email protected]:neo4jrb/neo4j-core.git', branch: 'debug-slow-connections'
. Затем пакетная установка, конечно. Это меняет способ обработки соединения. Интересно, есть ли проблема с адаптером, который мы использовали, и с Windows. - person subvertallchris   schedule 28.10.2014bundle install
Fetching [email protected]:neo4jrb/neo4j-core.git Warning: Permanently added the RSA host key for IP address '192.30.252.129' to t he list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. Retrying git clone "[email protected]:neo4jrb/neo4j-core.git" "C:/Ruby21-x64/lib/ruby/gems/2.1.0/cache/bundler/git/neo4j-core-71e20a094252d6e746dff80816a9edad56f9aeca" --bare --no-hardlinks
- person achalbi   schedule 28.10.2014gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'debug-slow-connections'
- person subvertallchris   schedule 28.10.2014