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