Начать работать с 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/
