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が扱う範囲では充分に理にかなっていると考える。