Ubuntu16.04上でのNeo4jをインストールして、Outlookメールを元に簡単なソーシャルネットワーク分析をやってみる


#目的
Neo4jの学習するために、Neo4jをインストールしてOutlookメールを元に簡単なソーシャルネットワーク分析を試みました。

#作業内容
##Ubuntuの環境
Ubuntuの環境は以下の通りです。

```shell-session:
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
$
```

##Neo4jインストール

[Installing Neo4j on Ubuntu](https://gist.github.com/zhuravel/5887936)を参考にNeo4jをUbuntu上にインストールしました。

```shell-session:
$ cd ~
$ wget -O - http://debian.neo4j.org/neotechnology.gpg.key >> key.pgp
$ sudo apt-key add key.pgp
$ echo 'deb http://debian.neo4j.org/repo stable/' | sudo tee -a /etc/apt/sources.list.d/neo4j.list > /dev/null
$ sudo apt-get update && sudo apt-get install neo4j
$ 
```

##リモートアクセス許可設定

[こちら](http://who-you-me.hatenablog.com/entry/2015/03/24/005555)のサイトに本番環境でリモートアクセスを許可するのは良くないと記載がありますが、今回は学習用なのでリモートアクセスは良しとします。

以下のファイルを書き換えます。書き換える前に内容を確認しておきます。

```shell-session:
$ cat /etc/neo4j/neo4j.conf |grep dbms.connector
#dbms.connectors.default_listen_address=0.0.0.0
#dbms.connectors.default_advertised_address=localhost
dbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL
#dbms.connector.bolt.listen_address=:7687
dbms.connector.http.enabled=true
#dbms.connector.http.listen_address=:7474
dbms.connector.https.enabled=true
#dbms.connector.https.listen_address=:7473
```

viで編集します。

```
$ sudo vi /etc/neo4j/neo4j.conf
[sudo] admin01 のパスワード:
```

以下のように書き換えました。

```
$ cat /etc/neo4j/neo4j.conf |grep dbms.connector
dbms.connectors.default_listen_address=0.0.0.0
#dbms.connectors.default_advertised_address=localhost
dbms.connector.bolt.enabled=true
#dbms.connector.bolt.tls_level=OPTIONAL
#dbms.connector.bolt.listen_address=:7687
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=0.0.0.0:7474
dbms.connector.https.enabled=true
dbms.connector.https.listen_address=0.0.0.0:7473
$

```


##Neo4jのサービススタート
Neo4jのサービスをスタートさせます。

```shell-session
$ sudo service neo4j start
```

##Neo4jのGUIアクセス

7474のポートを利用してGUIにアクセスできました。
![image](https://qiita-image-store.s3.amazonaws.com/0/177123/3eb7940c-dfe5-b00a-0ba2-b3c1580ced10.png)


##テストデータの準備（メールの送信情報と宛先情報）

[Outlook Export Tool](http://www.yamamototakashi.com/soft/outlookexporttool/)を利用して以下のような形でメールをテキスト出力することができました。
とある所属のメーリングリストで受信したメールをテキスト化しました。
これができたらNeo4jに転送します。

![image](https://qiita-image-store.s3.amazonaws.com/0/177123/ef611de6-5d17-6e9c-1a7f-96d14f81d2fa.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/177123/3c6578cb-3522-0f5f-20fb-c00645165110.png)




##データの正規化

ここではNeo4jにLoadするための以下の2つのファイルを作成します。
・mail_user  ：ユーザーのユニークな情報リスト
・mail_data  ：誰が誰にメールを送信したか分かる情報リスト

尚、Outlookからテキスト出力したメールテキストはUbuntuのホームディレクトリ配下の*mail*というディレクトリを作成して転送しました。

###UTF-8に変換
テキスト化したファイルの文字コードがunknown-8bitになって文字化けしていました。

```shell-session
$ file -i mail/1.txt
mail/1.txt: text/plain; charset=unknown-8bit
$
```

[テキストファイルを一括でiconv](http://qiita.com/yocifico/items/316bf6fd22b277cf2aa6)のサイトを参考にして、mailディレクトリ以下をiconvでUTF-8に変換しました。

```shell-session
$ find mail -type f | xargs file | grep  ":*.txt" | cut -d: -f1 | xargs -t -I{} iconv -f SHIFT_JIS -t UTF-8 {} -o {}
```

###宛先、差出人データの抽出（mail_dataファイルの作成）
メールデータの中から、宛先と差出人のデータのみをawkやsed、grep等を利用して抽出します。
※こちらはmailディレクトリの中で実行しています。

```shell-session
~/mail$ sudo head -n 4 * |grep -e 差出人 -e 宛先 | awk 'NR%2{sl=$0;next}{print sl":"$0}' |sed -e s/^M//g |awk -F: '{print $2,":",$4}' |sed -e s/","//g -e s/"\t"//g -e s/":"/","/g -e s/"'"//g -e s/" "//g -e 1s/^/source,destination\\n/g |sed -r 's/(<.*>)//g' > mail_data
~/mail$
```

以下のような送信元と受信側が誰か分かるデータになりました。
1行目にsource,destinationということでHeaderを付けており、2行目以降が送信元と受信元の実際のユーザー名です。

```shell-session
~/mail$ head mail_data
source,destination
AAAAAA,BBBBBB
CCCCCC,AAAAAA
　・
　・
　・
~/mail$
```

###ユニークなユーザーリストの抽出（mail_usersファイルの作成）
今度はawkやsed、grepコマンドを駆使してユニークなMailのユーザーリストを抽出します。

```shell-session
~/mail$ awk -F, '{print $1}{print $2}' mail_data |awk -F ";" '{print $1}'|awk -F "<" '{print $1}'|awk '!a[$0]++' | sort |grep -v source |grep -v destination |sed 1s/^/user\\n/g > mail_users 
~/mail$
```


mail_usersのデータは以下のような内容になっています。
1行目はuserということでHeaderを付けており、2行目移行がユニークなユーザー名です。

```shell-session
~/mail$ head mail_users
user
AAAAA
BBBBB
　・
　・
　・
~/mail$
```


###mail_usersとmail_dataのファイルを/var/lib/neo4j/import配下にコピー
作成したファイルを/var/lib/neo4j/import/配下にコピーします。
ローカルのファイルをNeo4jでロードするときはこちらのディレクトリ配下のものが対象となるようです。

```shell-session
~/mail$ sudo cp mail_users /var/lib/neo4j/import/mail_users
~/mail$ sudo cp mail_data /var/lib/neo4j/import/mail_data
~/mail$
```


##ユニークなユーザー情報をNeo4jのノードとしてロードする

ここからはNeo4jの操作となります。
GUIから実行できるCypherにて操作します。
ユニークなユーザー情報が含まれたファイルをNeo4jに取り込みます。

```
LOAD CSV WITH HEADERS FROM "file:///mail_users" AS csvLine
CREATE (n:Mailuser{username:csvLine.user})
```


##誰が誰にメールを送信したからのRelationshipをNeo4jで作成

こちらもNeo4jのGUI操作でCypherにて操作します。
誰が誰にメールを送信したかというRelationshipと言われる情報をmail_dataのファイルを使って作成します。

```
LOAD CSV WITH HEADERS FROM "file:///mail_data" AS csvLine
MATCH (source:Mailuser{username: csvLine.source})
MATCH (destination:Mailuser{username: csvLine.destination})
MERGE (source)-[r:send]->(destination)
```

##ソーシャルグラフの完成
Neo4jのGUIから参照するとグラフを閲覧できます。
ただ、個人名等が記載されているので、添付した画像はNeo4jのGUIではなく名称にぼかしを入れた画像のキャプチャです。

![image](https://qiita-image-store.s3.amazonaws.com/0/177123/823eb1bd-edc0-5fba-abd9-45a6ec071577.png)


#まとめ
Neo4jについて少し理解することができました。
今後はもっと本格的に触っていければと思います。