Статьи

Начало работы с Ruby и Neo4j

Начать работать с Ruby и Neo4j очень просто.
Выполните следующие действия, и вы сразу же приступите к работе.

Сначала мы установим гем неографии:

Используя Bundler:

1	echo "source 'http://rubygems.org'
2	gem 'neography' " > Gemfile
3	bundle install 

Без Бандлера:

1	gem install neography

Затем мы добавим наши задачи в Rakefile, загрузим Neo4j и запустим его:

1	echo "require 'neography/tasks'" >> Rakefile
2	rake neo4j:install
3	rake neo4j:start

Что вы можете сделать с графической базой данных?

Как насчет рекомендовать друзей в социальной сети?

01	require 'rubygems'
02	require 'neography'
03	 
04	@neo = Neography::Rest.new
05	 
06	def create_person(name)
07	  @neo.create_node("name" => name)
08	end
09	 
10	def make_mutual_friends(node1, node2)
11	  @neo.create_relationship("friends", node1, node2)
12	  @neo.create_relationship("friends", node2, node1)
13	end
14	 
15	def suggestions_for(node)
16	  @neo.traverse(node,
17	                "nodes",
18	                {"order" => "breadth first",
19	                 "uniqueness" => "node global",
20	                 "relationships" => {"type"=> "friends",
21	                                     "direction" => "in"},
22	                 "return filter" => {"language" => "javascript",
23	                                     "body" => "position.length() == 2;"},
24	                 "depth" => 2}).map{|n| n["data"]["name"]}.join(', ')
25	end
26	 
27	johnathan = create_person('Johnathan')
28	mark      = create_person('Mark')
29	phil      = create_person('Phil')
30	mary      = create_person('Mary')
31	luke      = create_person('Luke')
32	 
33	make_mutual_friends(johnathan, mark)
34	make_mutual_friends(mark, mary)
35	make_mutual_friends(mark, phil)
36	make_mutual_friends(phil, mary)
37	make_mutual_friends(phil, luke)
38	 
39	puts "Johnathan should become friends with #{suggestions_for(johnathan)}"
40	 
41	# RESULT
42	# Johnathan should become friends with Mary, Phil

Давайте пройдемся по каждому шагу:

Нам нужны наши драгоценные камни и мы получаем экземпляр Neography, подключающийся к серверу Neo4j:

1	require 'rubygems'
2	require 'neography'
3	 
4	@neo = Neography::Rest.new

Мы пишем функцию, чтобы нам было проще создавать узлы, имеющие свойство name:

1	def create_person(name)
2	  @neo.create_node("name" => name)
3	end

Затем мы создаем еще одну функцию, чтобы связать два узла вместе.
В Neo4j все отношения имеют направление, поэтому, если мы хотим, чтобы два человека были общими друзьями, мы создаем два отношения: одно входящее и одно исходящее.

1	def make_mutual_friends(node1, node2)
2	  @neo.create_relationship("friends", node1, node2)
3	  @neo.create_relationship("friends", node2, node1)
4	end

Теперь самое интересное. Мы хотим предложить вам подружиться с друзьями ваших друзей.

Таким образом, используя человека в качестве отправной точки, мы хотим наладить отношения с двумя друзьями и вернуться с друзьями друзей.

01	def suggestions_for(node)
02	  @neo.traverse(node,
03	                "nodes",
04	                {"order" => "breadth first",
05	                 "uniqueness" => "node global",
06	                 "relationships" => {"type"=> "friends",
07	                                     "direction" => "in"},
08	                 "return filter" => {"language" => "javascript",
09	                                     "body" => "position.length() == 2;"},
10	                 "depth" => 2}).map{|n| n["data"]["name"]}.join(', ')
11	end

Давайте проверим это, создав небольшой набор друзей и свяжем их вместе:

01	johnathan = create_person('Johnathan')
02	mark      = create_person('Mark')
03	phil      = create_person('Phil')
04	mary      = create_person('Mary')
05	luke      = create_person('Luke')
06	 
07	make_mutual_friends(johnathan, mark)
08	make_mutual_friends(mark, mary)
09	make_mutual_friends(mark, phil)
10	make_mutual_friends(phil, mary)
11	make_mutual_friends(phil, luke)
12	 
13	puts "Johnathan should become friends with #{suggestions_for(johnathan)}"
14	 
15	# RESULT
16	# Johnathan should become friends with Mary, Phil

Там у вас есть это. Довольно просто, верно?

Нет? Если это выглядит немного, можем ли мы сделать это проще?

Абсолютно. Neography позволяет работать на уровне REST API Neo4j, но также предоставляет дополнительный слой, усыпанный рубиновым синтаксическим сахаром.

01	require 'rubygems'
02	require 'neography'
03	 
04	def create_person(name)
05	  Neography::Node.create("name" => name)
06	end
07	 
08	johnathan = create_person('Johnathan')
09	mark      = create_person('Mark')
10	phil      = create_person('Phil')
11	mary      = create_person('Mary')
12	luke      = create_person('Luke')
13	 
14	johnathan.both(:friends) << mark
15	mark.both(:friends) << mary
16	mark.both(:friends) << phil
17	phil.both(:friends) << mary
18	phil.both(:friends) << luke
19	 
20	def suggestions_for(node)
21	  node.incoming(:friends).
22	       order("breadth first").
23	       uniqueness("node global").
24	       filter("position.length() == 2;").
25	       depth(2).
26	       map{|n| n.name }.join(', ')
27	end
28	puts "Johnathan should become friends with #{suggestions_for(johnathan)}"
29	 
30	# RESULT
31	# Johnathan should become friends with Mary, Phil

Взгляните на
документацию Neography для получения дополнительной информации.

В этом посте мы увидели, как обходить график, используя Traversal Framework напрямую.
В следующих публикациях я покажу вам еще два способа обхода графа через Gremlin и Cypher, а также много других вещей, которые вы можете сделать с Neo4j .

Найдите меня и многих других поклонников графиков в Neo4j Google Group .

Источник: http://maxdemarzi.com/2012/01/04/getting-started-with-ruby-and-neo4j/