Node.js
neo4j
G2GML

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

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

現在研究でグラフデータの分析に用いているORACLE PGXですが、これにデータをロードさせる際、

データの量や種類が増えてきているので、今までのやり方だとうまくデータを格納してPGXにロードできない!!

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

GPG とは

GPGは現在開発が進められているG2GMLという言語のファイル形式です。G2GMLについてはこちら

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

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

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

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

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

めちゃくちゃ分かりやすく、しかも生物のネタで例示してもらえていて(笑)、RDFについてブログ形式でまとめてくれている方がいたのでRDFをまず知りたい方は

直感RDF!! その1-RDFとは。

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

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

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

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

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

①Node.jsのインストール

G2GMLはNode.js上で動くので、Node.jsパッケージをこちらからダウンロードします。もしくは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を用いてパッケージをインストールします。

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

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

③GPGファイルの作成

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

nodes
    ID1 "name":"apple" "color":"red"
    ID2 "name":"taro" "age":"20"
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://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
dbms.connectors.default_listen_address=0.0.0.0 //「#」をはずす
$ $NEO4J_DIR/bin/neo4j console