SlideShare a Scribd company logo
1 of 28
Neo4j.rbにみるOGM
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
発表者紹介
2
高部 真一郎
(たかべ しんいちろう)
テクノロジックアート エンジニア
趣味はパラグライダー
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jでやりたいこと
3
・人探し、先祖探し
・ある一定の制限をもたせたパターン分析
・株のトレーディング
・グラフ理論を使った知的ゲーム
・人間系の色々
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jrb
4
今日はNeo4jrbのお話をします。
これは2014年に「Best Community Contribution」というものでGraphDB接続カン
ファレンス?で賞を獲得したrubyのライブラリです。
コミュニティがライブラリを開発して発表しているので参考までに題材にしてみました。
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jの利用
5
Neo4jの性能や事例については何度かア
ジェンダがあったけど、
アプリからどのように呼べばいいの?
→呼び出しに手間がかかるようだとNeo4j
自体は使い方によって速いし便利でも実
装しづらい・・・
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
Neo4jの利用
6
Neo4jの性能や事例については何度かア
ジェンダがあったけど、
アプリからどのように呼べばいいの?
→呼び出しに手間がかかるようだとNeo4j
は便利でも実装しづらい・・・
オブジェクトグラフマッパー(OGM)なるも
のがあります!
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
OGMとは
7
Object-Graph-Mapper(オブジェクトグラ
フマッパー)のこと。
O/Rマッパー( Object-relational
mapping )の一つであるRuby(プログラ
ミング言語)で利用されるActiveRecord
と同様の記載ができる。
O/Rマッパーって?ActiveRecordって?
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
O/Rマッパーとは
8
O/Rマッパーって?(分かっている方についてはすみません。説明も一部言い方が違うかも)
オブジェクトとリレーショナルデータベースのミスマッチをマッピング(対応付け)をすることです。
管理番号 分類 名称
001 哺乳類 シカ
002 爬虫類 ワニ
003 両生類 カエル
生物
哺乳類
シカ
爬虫類
ワニ
両生類
カエル
ミスマッチが生じる
例えば「シカ」インスタンスを扱いたい場合、
SQLで呼び出して変数に代入して・・・
データベース オブジェクト指向
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
O/Rマッパーとは
9
コネクション管理機能 データベースとの接続やコネクションプーリングが管理
できるようになる。
自動マッピング機能 外部ファイルにオブジェクトの属性名とテーブルの列名
に関するマッピング定義を設定することによって自動的
にマッピング処理を行ってくれます。
マッピングファイル、
DTO、DAOの自動生成
機能
O/Rマッピングツールの提供する自動生成ツールによっ
てマッピングファイル、DTO(DataTransferObject)、
DAO(DataAccessObject)といったファイルを自動で作成し
てくれます。
接続情報の管理機能 データベース接続のためのドライバやデータベースの接
続情報を、O/Rマッピングツール側で管理してくれます。
キャッシュ機能 一度取得した検索結果をメモリ上に保持しておいて、同
じ検索処理が行われた場合は、メモリ上にある検索結
果を返します。これによって、データベースへのアクセス
を減らし、パフォーマンスがあがります。
具体的にはこんな機能です・・
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
O/Rマッパーとは
10
つまり、オブジェクト指向的にデータベースを扱うことができる!
管理番号 分類 名称
001 哺乳類 シカ
002 爬虫類 ワニ
003 両生類 カエル
生物
哺乳類 爬虫類 両生類
橋渡し
データベース オブジェクト指向
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: ‘シカ’)
となる。
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
ORMとは
12
• O/Rマッピングを導入することで、ソースコードからデータベースにアクセスする
処理の部分を切り離すことがでるので、変更に強くなります。
• O/Rマッピングを導入することで、オブジェクトとリレーショナルデータベースとの
構造的な違いを意識することなく開発できます。さらに人が理解しやすいメソッド
を用意されている。
• 自動生成機能を利用することで、ソースファイルなどの作成の手間が省けるので
開発効率があがります。
• O/Rマッピングを導入することで、データベースの差(SQL方言の差)を吸収でき
ます。
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
話をOGMに戻すと
13
Object-Graph-Mapper、つまりNeo4jを代表とす
るグラフデータベースを利用しやすくしたもの!
では実際につかってみよう!
投稿(post)にコメント(comment)を追加していく
簡単なWebアプリケーションです。
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に少し記載するだけ
ではどんなアプリケーションであるか見てみましょう!
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アプリケーションが生成されます。
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
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
サンプルで実装していきましょう!
17
⚫️モデル、投稿のモデリング
app/model/post.rb
has_many :in, :comments, origin: :post
ここで一度rails s –p 3000
http://localhost:3000/posts
⚫画面、コメントを表示するコードを追記。
app/views/comments/_form_html.erb
<div class=“field”>
<%= f.label :post %><br>
<%= f.select :post,
options_from_collection_for_select(Post.all, :id :title,
@comment.post.try(:id)) %>
</div>
3枚目になってしまいました。
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枚目
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}
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と同じ。
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
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
投稿のサイトなんてみせられても仕方ない
22
ではどのように実装しているかみてみよう!
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
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
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
オープンソース
25
まあ、今日はこの辺りで・・・
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
感想
26
JavaのAPIを使ってneo4jからデータを取ってき
てActiveSupportでデータを使いやすくしている。
RDBを扱っているのとほぼ同じ記述でいけそ
う!
性能面の検証はまだですが、処理速度はそれほ
ど早くない印象。
オープンソースなので開発にご協力してみてくだ
さい!
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
GitHub
27
Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved.
ご静聴ありがとうございました!
28
ということで次回機会があり、今回のアジェンダ
の反響がよく、発表する機会があればjavaのア
プリをご紹介したいです。

More Related Content

What's hot

DIMoの操作実演とSCSKが提供する研修プログラム
DIMoの操作実演とSCSKが提供する研修プログラムDIMoの操作実演とSCSKが提供する研修プログラム
DIMoの操作実演とSCSKが提供する研修プログラムHirono Jumpei
 
クラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメクラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメHiromasa Oka
 
Deep inspectionの特徴
Deep inspectionの特徴Deep inspectionの特徴
Deep inspectionの特徴Rist Inc.
 
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話IoTにおけるクラウドインフラからサーバサイドまでの概要的な話
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話Terui Masashi
 
Deep Learning Lab コミュニティ 企画概要
Deep Learning Lab コミュニティ 企画概要Deep Learning Lab コミュニティ 企画概要
Deep Learning Lab コミュニティ 企画概要Hirono Jumpei
 
Hyperledger Tokyo Meetup 22/07/2020
Hyperledger Tokyo Meetup 22/07/2020Hyperledger Tokyo Meetup 22/07/2020
Hyperledger Tokyo Meetup 22/07/2020Atsushi Neki
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスEtsuji Nakai
 
Py conjp2017ジョブフェア
Py conjp2017ジョブフェアPy conjp2017ジョブフェア
Py conjp2017ジョブフェア創史 花村
 
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会Koichiro Sumi
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
ハイブリッドガイドライン解説
ハイブリッドガイドライン解説ハイブリッドガイドライン解説
ハイブリッドガイドライン解説Masahiko Ebisuda
 
Jazug3周年lt deployブランチを追加してみましょう
Jazug3周年lt deployブランチを追加してみましょうJazug3周年lt deployブランチを追加してみましょう
Jazug3周年lt deployブランチを追加してみましょうTadahiro Ishisaka
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用OSgeo Japan
 
Deep Security on Bluemix IaaSによるセキュリティ対策について
Deep Security on Bluemix IaaSによるセキュリティ対策についてDeep Security on Bluemix IaaSによるセキュリティ対策について
Deep Security on Bluemix IaaSによるセキュリティ対策についてBMXUG
 
【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5幸夫 茅根
 

What's hot (20)

DIMoの操作実演とSCSKが提供する研修プログラム
DIMoの操作実演とSCSKが提供する研修プログラムDIMoの操作実演とSCSKが提供する研修プログラム
DIMoの操作実演とSCSKが提供する研修プログラム
 
クラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメクラウドネイティブトランスフォーメーションのススメ
クラウドネイティブトランスフォーメーションのススメ
 
Deep inspectionの特徴
Deep inspectionの特徴Deep inspectionの特徴
Deep inspectionの特徴
 
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話IoTにおけるクラウドインフラからサーバサイドまでの概要的な話
IoTにおけるクラウドインフラからサーバサイドまでの概要的な話
 
Deep Learning Lab コミュニティ 企画概要
Deep Learning Lab コミュニティ 企画概要Deep Learning Lab コミュニティ 企画概要
Deep Learning Lab コミュニティ 企画概要
 
Hyperledger Tokyo Meetup 22/07/2020
Hyperledger Tokyo Meetup 22/07/2020Hyperledger Tokyo Meetup 22/07/2020
Hyperledger Tokyo Meetup 22/07/2020
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
タブブラウザSDKを作った話 #yjcamp
タブブラウザSDKを作った話 #yjcampタブブラウザSDKを作った話 #yjcamp
タブブラウザSDKを作った話 #yjcamp
 
Googleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービスGoogleにおける機械学習の活用とクラウドサービス
Googleにおける機械学習の活用とクラウドサービス
 
Bitbucket Pipelinesについて
Bitbucket PipelinesについてBitbucket Pipelinesについて
Bitbucket Pipelinesについて
 
Py conjp2017ジョブフェア
Py conjp2017ジョブフェアPy conjp2017ジョブフェア
Py conjp2017ジョブフェア
 
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会
Siderご紹介スライド@第2回 GitHub Enterprise ユーザ会
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
ハイブリッドガイドライン解説
ハイブリッドガイドライン解説ハイブリッドガイドライン解説
ハイブリッドガイドライン解説
 
Jazug3周年lt deployブランチを追加してみましょう
Jazug3周年lt deployブランチを追加してみましょうJazug3周年lt deployブランチを追加してみましょう
Jazug3周年lt deployブランチを追加してみましょう
 
Node-REDのworldmapの活用
Node-REDのworldmapの活用Node-REDのworldmapの活用
Node-REDのworldmapの活用
 
Hyperledger Projectの概要
Hyperledger Projectの概要Hyperledger Projectの概要
Hyperledger Projectの概要
 
Deep Security on Bluemix IaaSによるセキュリティ対策について
Deep Security on Bluemix IaaSによるセキュリティ対策についてDeep Security on Bluemix IaaSによるセキュリティ対策について
Deep Security on Bluemix IaaSによるセキュリティ対策について
 
【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5【AWS×Deployment】TechTalk #5
【AWS×Deployment】TechTalk #5
 
Prestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnightPrestoクエリログの保存/分析機能の構築 #yjdsnight
Prestoクエリログの保存/分析機能の構築 #yjdsnight
 

Similar to Neo4jrbにおけるOGM

RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナー
RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナーRICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナー
RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナーcontest-theta360
 
インタラクションデザインにおけるオープン化事例の検討
インタラクションデザインにおけるオープン化事例の検討インタラクションデザインにおけるオープン化事例の検討
インタラクションデザインにおけるオープン化事例の検討Yosuke Sakai
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについてMasahito Zembutsu
 
4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm4 Colors Othello’s Algorithm
4 Colors Othello’s AlgorithmTakaaki Suzuki
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能Yoshifumi Kawai
 
チームラボハンガー開発経緯トークセミナー
チームラボハンガー開発経緯トークセミナー チームラボハンガー開発経緯トークセミナー
チームラボハンガー開発経緯トークセミナー Minami Kumamoto
 
プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言Shigeru Kobayashi
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)Drecom Co., Ltd.
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
2019 05-19.overview
2019 05-19.overview2019 05-19.overview
2019 05-19.overviewShin-ya Koga
 
MediaPipeの紹介
MediaPipeの紹介MediaPipeの紹介
MediaPipeの紹介emakryo
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段Pierre3 小林
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsGo Sueyoshi (a.k.a sue445)
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開Hideki Takase
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内m ishizaki
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platformToru Yamaguchi
 

Similar to Neo4jrbにおけるOGM (20)

RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナー
RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナーRICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナー
RICOH THETA x IoT デベロッパーズ コンテスト 第2回クラウドAPIセミナー
 
インタラクションデザインにおけるオープン化事例の検討
インタラクションデザインにおけるオープン化事例の検討インタラクションデザインにおけるオープン化事例の検討
インタラクションデザインにおけるオープン化事例の検討
 
2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて2014年を振り返る 今年の技術トレンドとDockerについて
2014年を振り返る 今年の技術トレンドとDockerについて
 
Storyboard
StoryboardStoryboard
Storyboard
 
4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
 
チームラボハンガー開発経緯トークセミナー
チームラボハンガー開発経緯トークセミナー チームラボハンガー開発経緯トークセミナー
チームラボハンガー開発経緯トークセミナー
 
プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言プロトタイピングの潮流とデザイナーへの提言
プロトタイピングの潮流とデザイナーへの提言
 
「AROW」お披露目(実用編)
「AROW」お披露目(実用編)「AROW」お披露目(実用編)
「AROW」お披露目(実用編)
 
14対話bot発表資料
14対話bot発表資料14対話bot発表資料
14対話bot発表資料
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
2019 05-19.overview
2019 05-19.overview2019 05-19.overview
2019 05-19.overview
 
MediaPipeの紹介
MediaPipeの紹介MediaPipeの紹介
MediaPipeの紹介
 
.NETの自作ツール公開手段
.NETの自作ツール公開手段.NETの自作ツール公開手段
.NETの自作ツール公開手段
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開関数型言語ElixirのIoTシステム開発への展開
関数型言語ElixirのIoTシステム開発への展開
 
C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内C# Tokyo コミュニティ案内
C# Tokyo コミュニティ案内
 
ngCore engine for mobage platform
ngCore engine for mobage platformngCore engine for mobage platform
ngCore engine for mobage platform
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
 

Neo4jrbにおけるOGM

  • 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って?
  • 8. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. O/Rマッパーとは 8 O/Rマッパーって?(分かっている方についてはすみません。説明も一部言い方が違うかも) オブジェクトとリレーショナルデータベースのミスマッチをマッピング(対応付け)をすることです。 管理番号 分類 名称 001 哺乳類 シカ 002 爬虫類 ワニ 003 両生類 カエル 生物 哺乳類 シカ 爬虫類 ワニ 両生類 カエル ミスマッチが生じる 例えば「シカ」インスタンスを扱いたい場合、 SQLで呼び出して変数に代入して・・・ データベース オブジェクト指向
  • 9. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. O/Rマッパーとは 9 コネクション管理機能 データベースとの接続やコネクションプーリングが管理 できるようになる。 自動マッピング機能 外部ファイルにオブジェクトの属性名とテーブルの列名 に関するマッピング定義を設定することによって自動的 にマッピング処理を行ってくれます。 マッピングファイル、 DTO、DAOの自動生成 機能 O/Rマッピングツールの提供する自動生成ツールによっ てマッピングファイル、DTO(DataTransferObject)、 DAO(DataAccessObject)といったファイルを自動で作成し てくれます。 接続情報の管理機能 データベース接続のためのドライバやデータベースの接 続情報を、O/Rマッピングツール側で管理してくれます。 キャッシュ機能 一度取得した検索結果をメモリ上に保持しておいて、同 じ検索処理が行われた場合は、メモリ上にある検索結 果を返します。これによって、データベースへのアクセス を減らし、パフォーマンスがあがります。 具体的にはこんな機能です・・
  • 10. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. O/Rマッパーとは 10 つまり、オブジェクト指向的にデータベースを扱うことができる! 管理番号 分類 名称 001 哺乳類 シカ 002 爬虫類 ワニ 003 両生類 カエル 生物 哺乳類 爬虫類 両生類 橋渡し データベース オブジェクト指向
  • 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
  • 17. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. サンプルで実装していきましょう! 17 ⚫️モデル、投稿のモデリング app/model/post.rb has_many :in, :comments, origin: :post ここで一度rails s –p 3000 http://localhost:3000/posts ⚫画面、コメントを表示するコードを追記。 app/views/comments/_form_html.erb <div class=“field”> <%= f.label :post %><br> <%= f.select :post, options_from_collection_for_select(Post.all, :id :title, @comment.post.try(:id)) %> </div> 3枚目になってしまいました。
  • 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
  • 25. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. オープンソース 25 まあ、今日はこの辺りで・・・
  • 26. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. 感想 26 JavaのAPIを使ってneo4jからデータを取ってき てActiveSupportでデータを使いやすくしている。 RDBを扱っているのとほぼ同じ記述でいけそ う! 性能面の検証はまだですが、処理速度はそれほ ど早くない印象。 オープンソースなので開発にご協力してみてくだ さい!
  • 27. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. GitHub 27
  • 28. Copyright (C) TECHNOLOGIC ARTS INCORPORATED, All Rights Reserved. ご静聴ありがとうございました! 28 ということで次回機会があり、今回のアジェンダ の反響がよく、発表する機会があればjavaのア プリをご紹介したいです。