GPGからPGX / Neo4j形式へのファイル形式変換

こんにちは。
ノートパソコン早く変えたいです、、

現在研究でグラフデータの分析に用いているORACLE PGXですが、これにデータをロードさせる際、
> ####**データの量や種類が増えてきているので、今までのやり方だとうまくデータを格納してPGXにロードできない！！**

ということが起こってきました、、
そこで！もっと便利な方法としてデータの形式（書式）をGPG形式にする案がでたため、変更することにしました。

## GPG とは

GPGは現在開発が進められているG2GMLという言語のファイル形式です。G2GMLについては[こちら](https://github.com/g2gml/g2gml)

GPG形式は、ある1つのIDと、それに付随する各プロパティというデータの形をとります（key-value方式）。

GPG形式に変更することで、

- プロパティの数に制限がない
- つまり数を合わせる必要がない
- 記述する形式だけ注意すればノード、エッジを正しく認識してくれる、すなわちデータの順番に注意する必要もない

などといいことが色々とあります！

GPGのデータは、RDF(Resource Description Framework)データから変換されるそうで、データの表現自体はRDFデータでもそうなのですが、SVOの関係をとります！！

めちゃくちゃ分かりやすく、しかも生物のネタで例示してもらえていて（笑）、RDFについてブログ形式でまとめてくれている方がいたのでRDFをまず知りたい方は
> **「[直感RDF!!　その１-RDFとは。](https://qiita.com/maoringo/items/4742b5cd01c9e698260d)」**

**これを是非閲覧してください！！！！5分前後で読めるので絶対読みましょう。絶対。**

RDFでは要素ごとのグラフデータ化を行っていますが、GPGのようなプロパティ・データと呼ばれるものは、それらを組み合わせてある程度の要素を1つのノード、エッジにまとめようとしているのかなという印象を覚えました（理解不足でしたら後日訂正します...）

これにより、より効率的なデータの格納を行えるなと感じました。

文字ばっかりで疲れてきたと思うので、ちょっとやっていきましょう！

## GPGファイルをPGXにロードする

### ①Node.jsのインストール
G2GMLはNode.js上で動くので、Node.jsパッケージを[こちら](https://nodejs.org/ja/download/)からダウンロードします。もしくはwgetします。
そして.bash_profileに書いてパスを通します。

    $ cd ~
    $ mkdir node | cd node
    $ wget https://nodejs.org/dist/v8.9.4/node-v8.9.4-linux-x64.tar.xz
    $ tar xvJf node-v8.9.4-linux-x64.tar.xz
    $ cd ~
    $ vim .bash_profile
    export PATH=$PATH:$HOME/node/node-v8.9.4-linux-x64/bin
    $ . .bash_profile

### ②G2GMLのインストール

GitHubからレポジトリを共有して、[npm](https://www.npmjs.com/)を用いてパッケージをインストールします。

    $ cd ~
    $ git clone https://github.com/g2gml/g2gml.git
    $ cd g2gml
    $ npm install js-yaml fs require config

npm はnode.jsのパッケージを管理するためのツールだそうです、難しい。。でも便利ですね！

### ③GPGファイルの作成

GPGファイルは、GitHubを読んでいただければわかるかと思いますが、

```sh:nodes
    ID1 "name":"apple" "color":"red"
    ID2 "name":"taro" "age":"20"
```

```sh:edges
    ID1 ID2 "type":"like" "label":"fruit"
```

というように記述していきます。
ここで2つ注意したいことがあります。1つは、エッジデータの記述の際は**ラベルを定義する前にエッジの性質？（type）を定義する必要がある**ことです。もう1つはエッジデータのIDの順番で有向性を持つので**カラムの順番に注意**してください。

### ④GPGファイルをPGXロードファイルに変換する

G2GMLで実装されているGPG_to_PGXを利用してファイルの変換を行います！

    $ cd ~/g2gml
    $ node src/gpg_to_pgx.js ~/create_file.gpg ~/create_file

インプットとアウトプットとして、作成したファイル（上記ではcreate_file.gpgにあたる）の場所と変換後のファイルの置き場所を指定します。

変換に成功したら、以下のような文が表示されます。

    "/home/ec2-user/create_file.pgx.nodes" has been created.
    "/home/ec2-user/create_file.pgx.edges" has been created.
    "/home/ec2-user/create_file.pgx.json" has been created.

これでノード、エッジ、jsonとすべて変換してもらえますね、すごい楽です、、、、有難うございます、、、、

実際にロードできるかも試して見ましょう。以下のロードは私が実際に使っているファイルです。

    $ pgx
    
    pgx> G = session.readGraphWithProperties("output/druppi.json")
    ==> PgxGraph[name=druppi.pgx,N=22398,E=7080173,created=1517221695676]

と、このようにロードが出来ると思います！！

### ⑤Neo4jへロードする

![neo4j.png](https://qiita-image-store.s3.amazonaws.com/0/190039/a0adf2c1-8a6e-2df1-5069-6517088c5d35.png)

https://neo4j.com/product/#neo4j-desktop

Neo4jを用いると、ノード、エッジの情報がこんなように可視化して見れるわけです。やはり可視化というのは情報の理解しやすさが段違いです。

というわけで、Neo4jをインストールして、データを入れます！

    $ export NEO4J_DIR=~/neo4j/neo4j-community-3.3.2
    $ rm -r $NEO4J_DIR/data/databases/graph.db
    $ $NEO4J_DIR/bin/neo4j-import \
      --into $NEO4J_DIR/data/databases/graph.db \
      --nodes output/create_file.neo.nodes --relationships output/create_file.neo.edges

ここまで出来たら、外からアクセスできるようにして起動します。

    $ vim $NEO4J_DIR/conf/neo4j.conf

```vim
dbms.connectors.default_listen_address=0.0.0.0 //「#」をはずす
```

    $ $NEO4J_DIR/bin/neo4j console