2015年4月14日火曜日

セミナー「Neo4j ユーザー勉強会 #3 (テクニカル編)」


Neo4j ユーザー勉強会 #3 (テクニカル編) に参加した。Neo4jイベントは懇親会以外皆勤。
ちょこっと動かしてみてネタを放り込んでいる(スキルマップ、テキストマイニング系)が、まだWebGUIだけしかいじってないのと、なかなか効率のよい使い方が分からないのと、CypherQueryでこういうときにこうすれば、というのがいまいちぴんと来ないので、テクニカル編に期待して参加。


【Neo4jユーザグループからのお知らせ(案浦氏)】

 協力者募集中。全国のOSSイベントに参加するとか。

【Neo4j概要(Ver2.2)(鈴木いっぺい氏)】

(Ver2.2の概要について。性能、スケーリング関連とのこと。3/26に開催されたPhilip Rathle氏資料に基づいて説明。)
  • パフォーマンスが100倍、スケーラビリティでRead10倍、Write100倍。
  • Cost-based Optimizer(コストベース最適化。負荷分析型)。内部処理でデータの状態を見て検索を最適化。性能UP
  • クエリのプラン可視化ツール(Visual Query Plans)。(どのように早めに一旦数を減らすか、の確認ができる?) MAX DE MARZI氏ブログが、深いところに突き詰められている。このツールの使用例あり。
  • 従来はルールベースの検索だが、コストベースも選択できるようになった。Cypherが自動的に選んだり、マニュアルで変えたりして比較ができる。
  • ProfileとExplainというコマンドが登場。Profileは実際どの程度かかったかわかる。Explainはクエリを走らせずにプラン参照ができる。
  • Neo4j自体がインメモリでページキャッシュを持つようになった。グラフDBに特化したページキャッシュの方法、OSに依存しない。
  • Unified Commit。トランザクションログの並列処理でWrite性能UP。
  • Web画面で、Movieの他に、Northwind(スーパーの卸元と……。csvでダウンロードしてグラフ化。豆腐の購入履歴と、豆腐を買った人が何を買っているか、とか)、QueryTemplates(クエリを色々エディットできる)がトップページにできた。(おー!) csvに関係性がない場合の関係性について、とか具体的なコマンドとか書かれている。テーブルのjoinから引っ張れたり、とか。最適化する方法とか(最初の検索からの絞込み。)。Query TemplateではGUIで何か入れるとCypherQuery出してくれるとか。(おーーーー!!) 単なるメニューではなくツールとして役立つようなものになっている。

 

【ユーザセッション1(李氏)】

レコメンデーションエンジンとしてどの程度複雑なものができるかについて。MySQLとかでやっていたものをCypherQueryで置き換えてみた内容の紹介。ECサイト販売履歴をモチーフ。
  • ユーザ、商品、価格の情報があり(いろいろあるがわかりやすく3つに絞っている)、ユーザ別のレコメンデーション商品を割り出す方法。
  • データは、uid、gid、price(ユーザ、商品、価格)。ユーザ、商品があり、「買った」関係を持たせる。商品には名前と価格を持たせる。「買った」にはUnitとして個数を加算。
  • 購入した商品が多いユーザtop10、そのユーザが買った商品top10、商品top10の中で単価top10。商品単価top10を購入したユーザtop10。(order by price desc limit 10とか。)絞り込んで絞り込んで……をそのまま書ける。売上金額top10のなかでどれか購入したユーザ。そのユーザが購入した商品top10。商品Aを買っていない顧客の中で優良顧客(いろいろ買ってる人)にAを勧める。(なんかレコメンデーションっぽくなってきたぞ!) Aを買っていない顧客の中でXを購入している優良顧客にAを勧める。(match(u.user-->(g) where g.name in ["A","B","C"] ……) ABCのなかでどれか購入している顧客に、購入していないものを勧める。(return ..filter (x in ["A","B",...)
  • 「売上top10商品。買っているユーザ。そのユーザが最も買っている商品。そのどれかを買っている場合のリスト。買っている場合に買っていない残りのリストとユーザ。」を一気にクエリで投げられる。(順番に、順番に……)これで17句。
  • 一つ一つは簡単だが組み合わせが難しい。Filter (x in ["A","B",..] where not (x in ["A","C"]))) as result ……。outer join のような処理ができる。ただRDBの1/10程度で書けたりする。

【ユーザセッション2(宮田氏@Technologic Arts)】

年間100億の損害が出ている米国の銀行で、グラフの威力を使って検知する。ファーストパーティー(当事者)詐欺(First Party Fraud)。1つの電話番号が二人から使われている場合、その電話番号は詐欺に使われている可能性がある、とかはRDBでは関係性が少なければ何とかなるが、増えた場合は厳しい。
銀行の口座を持っている人。他に何を持っているか(口座、クレジットカード、ローンなど)を紐付けている。クレジットカードにもトランザクションをもたせている。Account_Holder、Current_Limit(限度額)、Current_Balance(今どこまで使っているか)、Late_Payments(遅延回数)。Suspicious_Transaction(疑わしい取引。過去の平均購入額、標準偏差から判断。標準偏差の二倍を超えるのは5%しかない)。match (act1:AccountHolder)-[]->(cnt)<-[]=(act2:AccountHolder) returns act1, cnt, act2 limit 25 。SSN(国民番号)を2つもつとかでグラフがリング状になるのは詐欺検知の方法の一つ。円の隣に居るのが何か、リングがいくつの円で構成されているか。(←これはグラフDBで自動? 事前に計算?? ←これはCypherQueryで記載する。stdevp、sum(txn.amount)/count(txn)) とか。) match(a:AccountHolder)-[]->(c)<-[]-(b:AccountHolder)-[*..8] ... とかでリングがいくつの円から構成されているかわかる。

【日本での事業展開について(安田氏@CREATIONLINE)】

(前回のイベントで、この会社はNeo4jの入門サイトとかあると紹介されていた。)
導入事例@海外、が、サイトで公開されている。
コンサルティング、トレーニングサービスがある。

【グラフ型データベースの書籍企画について(長瀬氏@テクノロジックアート)】

Neo4jの書籍(日本語)を出す予定。グラフDB基礎、事例、例題等を予定。執筆者募集中。

 【その他】

丸の内で勉強会あり。(多分参加しないけど、ハンズオン資料が公開されているようなので確認しておかなきゃ!)
maruneo4j.doorkeeper.jp