neo4j_fdw プロトタイプ
今月にはいってコツコツと合間をみて開発していた、neo4j_fdwのプロトタイプがやっとできた。
このプロトタイプはオープンソースのグラフデータベース neo4j を情報源にしたFDWだ。
実行例
で、これを情報源とする外部サーバと外部テーブルを定義する。拡張名はとりあえず neo4j_fdw にしておいた(何もひねりなしw)
CREATE EXTENSION neo4j_fdw; CREATE SERVER foo FOREIGN DATA WRAPPER neo4j_fdw OPTIONS (url 'http://localhost:7474/db/data/cypher'); CREATE FOREIGN TABLE bar ( name text, gender text) SERVER foo OPTIONS (query '{"query":"START n=node(*) RETURN n.name as name, n.gender? as gender " }');
外部サーバのオプションとしてNeo4jに接続するためのURLを指定する。
外部テーブルのオプションとして、Neo4jが提供するグラフデータベース検索用言語Cypherのクエリを設定する。このクエリの結果(RETURN句)は外部テーブルのカラム名に(とりあえずは)合わせておく。
んで、実行。
SELECT * FROM bar; name | gender ------+-------- 大和 | Male 武蔵 | Male 長門 | Male 陸奥 | Male 伊勢 | Half 日向 | Half 赤城 | Famale 加賀 | Famale 信濃 | Famale 飛龍 | Famale 蒼龍 | Famale (11 rows)
neo4jからデータを取得してPostgreSQLに返却できた。
今後
まだまだこのFDWは能力不足なので、今後こんな改善を検討中。
- CypherクエリをSQLから指定可能にする。
- 現状のTABLEオプションとの関係を整理する必要もある。
- データタイプ対応
- 現状はTEXTしか(たぶん)対応できないが、FDW内で型変換してPostgreSQLに返却する。
- でも、今のところ外部テーブルはインデクス対象にできないから、今ひとつモチベーションが上がらぬ。
- hstore対応
- Cypherクエリの指定としてRETURN句にnodeあるいはedgeを指定した場合、そのnodeまたはedgeに含まれるすべてのプロパティをhstoreに変換すると、NoSQLっぽい?
- 有効な用途
- とりあえず作ってはみたものの、役に立つ使い方をまだ考えてないw
もうちょっとブラッシュアップして、次回のアンカンファレンスで発表したいな。