neo4j_fdw プロトタイプ

今月にはいってコツコツと合間をみて開発していた、neo4j_fdwのプロトタイプがやっとできた。
このプロトタイプはオープンソースのグラフデータベース neo4j を情報源にしたFDWだ。

実行例

Neo4j上でテキトーにノードとエッジを張っておく。

で、これを情報源とする外部サーバと外部テーブルを定義する。拡張名はとりあえず 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

もうちょっとブラッシュアップして、次回のアンカンファレンスで発表したいな。