2. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
発表者紹介
2
高部 真一郎
(たかべ しんいちろう)
テクノロジックアート エンジニア
趣味はパラグライダー
3. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jでやりたいこと
3
・人探し、先祖探し
・ある一定の制限をもたせたパターン分析
・株のトレーディング
・グラフ理論を使った知的ゲーム
・人間系の色々
4. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jrb
4
今日はNeo4jrbのお話をします。
これは2014年に「Best Community Contribution」というものでGraphDB接続カン
ファレンス?で賞を獲得したrubyのライブラリです。
コミュニティがライブラリを開発して発表しているので参考までに題材にしてみました。
5. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jの利用
5
Neo4jの性能や事例については何度かア
ジェンダがあったけど、
アプリからどのように呼べばいいの?
→呼び出しに手間がかかるようだとNeo4j
自体は使い方によって速いし便利でも実
装しづらい・・・
6. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jの利用
6
Neo4jの性能や事例については何度かア
ジェンダがあったけど、
アプリからどのように呼べばいいの?
→呼び出しに手間がかかるようだとNeo4j
は便利でも実装しづらい・・・
オブジェクトグラフマッパー(OGM)なるも
のがあります!
7. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
OGMとは
7
Object-Graph-Mapper(オブジェクトグラ
フマッパー)のこと。
O/Rマッパー( Object-relational
mapping )の一つであるRuby(プログラ
ミング言語)で利用されるActiveRecord
と同様の記載ができる。
O/Rマッパーって?ActiveRecordって?
11. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
くどいですが例です。
11
例えば、哺乳類の全てを選びたい場合・・・
SQLでは SELECT * FROM MAMMAL;(Cypher Match n Return n Litmi) とかなるのが、
O/Rマッパー(ActiveRecord)を使うとプログラム上から
mammals = Mammal.all(これはActive supportっぽいですが、)
最初の哺乳類は
(例?)mammal = Mammal.first
シカという名前を持つ最初の哺乳類を探したい場合は
deer = Mammal.find_by(name: ‘シカ’)
となる。
12. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
ORMとは
12
• O/Rマッピングを導入することで、ソースコードからデータベースにアクセスする
処理の部分を切り離すことがでるので、変更に強くなります。
• O/Rマッピングを導入することで、オブジェクトとリレーショナルデータベースとの
構造的な違いを意識することなく開発できます。さらに人が理解しやすいメソッド
を用意されている。
• 自動生成機能を利用することで、ソースファイルなどの作成の手間が省けるので
開発効率があがります。
• O/Rマッピングを導入することで、データベースの差(SQL方言の差)を吸収でき
ます。
13. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
話をOGMに戻すと
13
Object-Graph-Mapper、つまりNeo4jを代表とす
るグラフデータベースを利用しやすくしたもの!
では実際につかってみよう!
投稿(post)にコメント(comment)を追加していく
簡単なWebアプリケーションです。
14. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
このコマンドだけです。
14
rails new whisper -m http://neo4jrb.io/neo4j/neo4j.rb -O
cd whisper
rake neo4j:install[community-2.1.4,development]
rake neo4j:config[development,7000]
rake neo4j:start
追記
config.neo4j.session_type :server_db
config.neo4j.session_path = 'http://localhost:7000‘
rails g scaffold post title body
rails g scaffold comment body
追記
has_one :out, :post, type: :comments_on
has_many :in, :comments, origin: :post
あとはviewに少し記載するだけ
ではどんなアプリケーションであるか見てみましょう!
15. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
サンプルで実装していきましょう!
15
⚫Webアプリ全体とneo4j
rails new whisper -m http://neo4jrb.io/neo4j/neo4j.rb -O
cd whisper
rake neo4j:install[community-2.1.4,development]
rake neo4j:config[development,7000]
rake neo4j:start
⚫データベース定義
config/environments/development.rb
config.neo4j.session_type :server_db
config.neo4j.session_path = 'http://localhost:7000'
何もない状態(rubyやrakeは入っている必要がありますが・・・)から下記のコマンド
を実行するだけでNeo4jのWebアプリケーションが生成されます。
16. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
サンプルで実装していきましょう!
16
⚫画面、モデルとビューの作成
rails g scaffold post title body
rails g scaffold comment body
ここからがモデリングの話
⚫モデル、まずコメントの定義
app/model/comment.rb
has_one :out, :post, type: :comments_on
18. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
サンプルで実装していきましょう!
18
⚫投稿に各コメントを表示するコードを記載
app/views/posts/show.html.erb
<ul>
<% @post.comments.each do |comment| %>
<li><%= comment.body %></li>
<% end %>
</ul>
⚫コントローラにpostの情報も渡してあげる
app/controllers/comments_controller.rb
def comment_params
params.require(:comment).permit(:body, :post)
end
4枚目
19. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
サンプルアプリログ
19
Railsログをみると・・・
CYPHER 40ms MATCH (result_comment:`Comment`) WHERE
(result_comment.uuid = {result_comment_uuid}) RETURN
result_comment ORDER BY ID(result_comment) LIMIT {limit_1}
20. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
コード内部での書き方
20
⚫新しいノードの作成は
@comment = Comment.new(comment_params)
@comment = Comment.find(params[:id])
⚫保存は
@comment.save、@comment.update(comment_params)
ほぼほぼ、ActiveRecordと同じ。
21. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
モデリングのおさらい
21
⚫投稿モデル
class Post
include Neo4j::ActiveNode
property :title, type: String
property :body, type: String
has_many :in, :comments, origin: :post
end
⚫コメントモデル
class Comment
include Neo4j::ActiveNode
property :body, type: String
has_one :out, :post, type: :comments_on
end
22. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
投稿のサイトなんてみせられても仕方ない
22
ではどのように実装しているかみてみよう!
23. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
オープンソース
23
blog/vendor/bundler/ruby/2.1.0/gems
ここにライブラリが保存されています!
neo4j-4.1.5
neo4j-core-4.0.7
がneo4j関連で
blog/vendor/bundler/ruby/2.1.0/gems/neo4j-
4.1.5/lib/neo4j/active_node
24. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
オープンソース
24
例えばactive_nodeのnode_wrapper.rbなんかは・・・
require 'active_support/inflector/inflections'
module Neo4j
module ActiveNode
module HasN
class Association
include Neo4j::Shared::RelTypeConverters
include Neo4j::ActiveNode::Dependent::AssociationMethods
attr_reader :type, :name, :relationship, :direction, :dependent
def initialize(type, direction, name, options = {})
validate_init_arguments(type, direction, options)
@type = type.to_sym
@name = name
@direction = direction.to_sym
@target_class_name_from_name = name.to_s.classify
apply_vars_from_options(options)
end