キャストがめんどい

Apache AGEでグラフを作成すると、ag_catalogスキーマに、graph_name._ag_label_vertex / graph_name._ag_label_edgeと、それらをInheritしたリレーションができる。で、ここで使われるデータ型はAGEのものなので、例えば、idはgraphid型だし、propertiesはagtype型となっている。一見、graphid型はBIGINTに見えるのだけど、AGE 1.5では直接のキャストは用意されていないので、明示的に2段階のキャストが必要となる。

つまり、cast from graphid to bigintは無い。

postgres=> \dx+ age
                                   Objects in extension "age"
                                       Object description
------------------------------------------------------------------------------------------------
 cast from agtype to bigint
 cast from agtype to boolean
 cast from agtype to double precision
 cast from agtype to graphid
 cast from agtype to integer
 cast from agtype to integer[]
 cast from agtype to smallint
 cast from agtype to text
 cast from bigint to agtype
 cast from boolean to agtype
 cast from double precision to agtype
 cast from graphid to agtype

ので、以下のようなキャストがしばしば必要となる。

start_id::agtype::bigint
some_id::agtype::graphid

agtypeから値を取り出すのは、JSON同様にやれば良い。

SELECT CAST(properties->"name" AS TEXT)

もちろん、graphidやagetype同士のoperatorはあるので、そのまま保存する一時テーブルなどでは特に問題にはならない、と。

operator <=(graphid,graphid)
operator <>(graphid,graphid)
operator <(graphid,graphid)
operator =(graphid,graphid)
operator >=(graphid,graphid)
operator >(graphid,graphid)

graphid型がBIGINTそのままではないのは、おそらく先日書いた通り、64ビットを16 + 48ビットに分割して使ってるから。ダイレクトにキャストされると、ビットマスクが破壊されるよね。これは64ビットのPostgreSQLが扱う範囲では充分に理にかなっていると考える。