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 WrapperPostgreSQL
Relational Model
CypherQuery
JSONResult
SQL
PostgreSQLRecord
Defined Cypher Query
Execute Cypher Query on REST
Generate PostgreSQL Record
Neo4j-FDWConceptProvide Cypher result View.
Graph Model
olumn1 column2 column3
・・・ ・・・ ・・・
・・・・ ・・・・ ・・・
実はかなり手抜きな FDW です
条件 pushdown は早々に諦めた。
Cypher の場合、 WHERE 句 pushdown は性能上はあまり効果的でない(建前)
面倒(本音)
neo4j_fdw の実装以下、各関数の簡単な実装方針の説明
BeginForeignScanCREATE SERVER に記述した接続情報で Neo4j に接続し
CREATE FOREIGN TABLE に記述したCypher を REST-API 経由で実行Cypher 実行結果( JSON) から
ResultSet を生成
IterateForeignScan生成した ResultSet から 1 レコード分の
値を取り出して Tuple 生成&返却ResultSet 終端に達していたら
空の Tuple を生成&返却
ReScanForeignScanResultSet の初期化
(カーソルの初期化)
EndForeignScan各種の終了処理
他のインタフェースプラン・統計情報等は
まともに実装できていない・・・更新系も未対応
neo4j_fdw のデモ
興味のある方はソースをGithub に置いたので
見てくださいませ(まだまだ開発途上ですが)
https://github.com/nuko-yokohama/neo4j_fdwhttp://wiki.postgresql.org/wiki/Foreign_data_wrappers#Neo4j_fdw
なんか pull request 来てるけど放置してる・・・まずい・・・
TODO:限定された条件 pushdownきちんとしたデータ型対応node/edge の hstore 化更新対応(出来るの?)