Neo4j-FDW
ぬこ@横浜 (@nuko_yokohama)
FDW とは
PostgreSQL には
Foreign Data Wrapper という
外部情報源を仮想テーブル化する
ステキ開発フレームワークがある。
( Oracle, MySQL, Redis, MongoDB,
CouchDB, Twitter, etc… )
光あるところに影がある
まこと栄光の影に数知れぬ
FDW の姿があった
命をかけて使われぬ FDW を
つくった暇人たち
今日のお題
Neo4j FDW 試作
ちょっと前に
Neo4j という
グラフデータベースを
触る機会があった。
What's Neo4j ?
オープンソースのグラフデータベース
「ノード」と「エッジ」を操作
ビジュアルな管理コンソール
Java-API/REST-API による操作
Cypher という問合わせ言語
見てもらうほうが
早いと思うので
Neo4j のデモ
Cypher クエリを
一定の規則で書くと
RDBMS の ResultSet
っぽい結果が返る
Cypher を利用して
PostgreSQL から SQL 経由で
Neo4j を検索する
FDW を作ってみた
neo4j_fdw
Neo4j Server
Neo4j Foriegn Data Wrapper
PostgreSQL
Relational Model
Cypher
Query
JSON
Result
SQL
PostgreSQL
Record
Defined Cypher Query
Execute Cypher Query on REST
Generate PostgreSQL Record
Neo4j-FDW
Concept
Provide Cypher result View.
Graph Model
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
実はかなり
手抜きな FDW です
条件 pushdown は
早々に諦めた。
Cypher の場合、 WHERE 句 pushdown は
性能上はあまり効果的でない(建前)
面倒(本音)
neo4j_fdw の実装
以下、各関数の簡単な実装方針の説明
BeginForeignScan
CREATE SERVER に記述した
接続情報で Neo4j に接続し
CREATE FOREIGN TABLE に記述した
Cypher を REST-API 経由で実行
Cypher 実行結果( JSON) から
ResultSet を生成
IterateForeignScan
生成した ResultSet から 1 レコード分の
値を取り出して Tuple 生成&返却
ResultSet 終端に達していたら
空の Tuple を生成&返却
ReScanForeignScan
ResultSet の初期化
(カーソルの初期化)
EndForeignScan
各種の終了処理
他のインタフェース
プラン・統計情報等は
まともに実装できていない・・・
更新系も未対応
neo4j_fdw のデモ
興味のある方はソースを
Github に置いたので
見てくださいませ
(まだまだ開発途上ですが)
https://github.com/nuko-yokohama/neo4j_fdw
http://wiki.postgresql.org/wiki/Foreign_data_wrappers#Neo4j_fdw
なんか pull request 来てるけど放置してる・・・
まずい・・・
TODO:
限定された条件 pushdown
きちんとしたデータ型対応
node/edge の hstore 化
更新対応(出来るの?)

Pgunconf neo4j fdw