AGEFreighter 1.0.0a3リリース

Azure

かなり大きなリファクタリングをして、1.0.0系のリリースに漕ぎ着けました。

変更点

ライブラリからCLIツールに変更

例えばNeo4jから移行するのに、コードを書かないとならないのはけっこう辛い、と。
一方で、ライブラリ以上にCLIツールでは汎用的な作りにする必要があり、0.9までのノウハウは活かしているものの、中身はほとんど書き直しました。クラス構造なども全く別物です。

pandas依存を可能な限り廃止

旧バージョンはデータをpandasのDataFrameとして読み込み、それをpsycopgによって、Cypherクエリ、SQLクエリ、あるいはCOPYプロトコルを使ってApache AGEに流し込む実装としていました。
しかし速度の面でCOPYプロトコルに大きなアドバンテージがあり実装を絞ってしまった方が良いことや、読み込んだデータをCOPYコマンドが出力するCSVファイル形式にしてしまってから、非同期に読み込みつつCOPYプロトコルで流し込む方が高速なことが分かったため、そのようなデザインに変更しました。

副産物として、COPYコマンドで使えるCSVファイルを、一時ファイルではなくコマンドを実行しているディレクトリに保存する機能も追加しました。以下のように指定します。

agefreighter load --save-temps

マルチスレッド・マルチプロセッシング

ツールとして使う範囲では分かりにくいですが、実装は全てマルチスレッドになっており、必要に応じてマルチプロセッシングも使っています。これは実行しているマシンの性能を生かし切るために必要なことです。また、ライブラリとして使う場合、多くの機能はasyncで使えるはず、です。旧バージョンではクラスによって対応がバラバラでした。

例えば、Neo4jからAGEへの流し込みは、以下のようにコンテキストマネージャを利用し、withブロックを抜ければ、neo4jとPostgreSQLへのコネクション(あるいはコネクションプール)はclose()されます。

from agefreighter.neo4jexporter import Neo4jExporter

async with Neo4jExporter(arg1, arg2) as exporter:
    await exporter.export()
    await exporter.copy()

src/agefreighter/main.pyが参考になるはずです。

元となるグラフの構造によってクラスを使い分けるのを廃止

CSVFreighterやMultiCSVFreighterなど、色々なクラスが増えてしまったので、–source-typeという引数のみで指定するようにしました。一方で様々なグラフの構造に対応するため、–source-type csvの場合は、–configという引数で、グラフ構造を指定するJSONを渡すようにしました。

他方で、avro / parquetファイルやnetworkxから読み込む機能は廃止しました。また、PostgreSQLから読み込んでAGEに流し込む機能は未実装ですが、次のToDoリストに入っています。

AzureStorageを使うクラスを廃止

トータルでかかる時間を考慮すると、AzureStorageに一度アップロードし、それをazure_storageエクステンションでPostgreSQLにロードし、さらにそこからAGEに流し込むと、クライアントからAGEに直接流し込む場合とほとんど変わらない、あるいはむしろ遅くなることが分かったため、廃止しました。–source-type csvを利用してください。

AGE用の統合ツールに変身

AGEFreighter、g2c、WatchAGE、pcypherと色々なツールを作ってきましたが、全てAGEFreighterに統合し、load / convert / view / parse等のサブコマンドにしました。例えば、loadでデータを流し込んだら、そのままviewで閲覧することが可能になりました。

オンデマンドでの依存関係の解消

旧バージョンでは依存する全てのPythonパッケージをインストールする必要があり、AGEFreighterパッケージがかなり大きくなっていました。1.0系では、サブコマンド、あるいはさらにその引数に応じて、必要なPythonパッケージをインストールするか否か、ユーザの判断を求めるようにしました。
例えば、agefreighter load –source-type neo4jとするとneo4jパッケージを、agefreighter viewとするとflaskパッケージのインストールをするか、尋ねてくるようにしました。

インストール方法

Homebrew

brew tap rioriost/agefreighter https://github.com/rioriost/agefreighter.git
brew install agefreighter

uv

uv init your_project
cd your_project
uv venv
source .venv/bin/activate
uv add agefreighter==1.0.0a3

pip on macOS / Linux

mkdir your_project
cd your_project
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install agefreighter==1.0.0a3

pip on Windows

mkdir your_project
cd your_project
python -m venv venv
.\venv\Scripts\activate
python -m pip install agefreighter==1.0.0a3

レポジトリ

GitHub / PyPI

タイトルとURLをコピーしました