[Neo4J]　①これは、何？

#1) グラフDB  Neo4j
## 導入は簡単
ローカルのUbuntuマシンの場合、以下でneo4jをinstall&startできた:

```sh
 wget -O - http://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add -
 sudo sh -c "echo 'deb http://debian.neo4j.org/repo stable/' > /etc/apt/sources.list.d/neo4j.list"
 sudo apt-get update
 sudo apt-get install neo4j
 sudo service neo4j-service start
```

ディフォルトで、ローカル向けのwebインターフェースが立ち上がっているので、localhost:7474にアクセスする:

![ne4j_start.png](https://qiita-image-store.s3.amazonaws.com/0/16455/87afcfbb-978f-7f72-1a7c-b4900496347f.png)
少しいじくってみるとわかるが、webインターフェースは入門者向けにも十分に作りこまれている。


##Usecase
[creationline社のサイト](http://www.creationline.com/neo4j/customers.html)から導入事例を引用させてもらう。Neo4Jはproduction readyで割と幅広く使われているものらしい。
![usecase.png](https://qiita-image-store.s3.amazonaws.com/0/16455/a728854d-5b79-e3d6-ae97-94cb3d92a178.png)

グラフ構造というとfacebookが思い浮かぶため、第一感ではレコメンド用途が主流かと思ったが、不正検知とかネットワーク管理などでも使われているのか。医薬分野での活用はいかにもありそう。


#2) Neo4Jの歴史と現在
##歴史
のた犬のうまい猫めしさんのブログ["Neo4j公式サイト記事翻訳してみた"](http://notainu.hateblo.jp/entry/2015/08/22/195121)にNeo4J歴史などもろもろが訳されている。Neo4jの歴史:

```
2000 - NeoTechnology社の創設者は、RDBMSのパフォーマンス上の問題を解決できる、最初のNeo4jのプロトタイプを構築し始めました。
2002 - Neo4jの初版が開発されました。
2003 - Neo4jが最初に常時サービス提供できるようになりました。
2007 - Neo4jの後ろ盾となる会社をスウェーデンに作りました。Neo4jをGPLライセンスの元でオープンソース化しました。
2009 - 継続的な開発を行うため、サンストーンとコナーから資金を調達しました。
2010 - Neo4jのバージョン1.0をリリースしました。
2011 - ラウンドを上げ、シリコンバレーに本社を移転しました。
```

*「RDBMSのパフォーマンス上の問題解決のため、スウェーデンでjavaベースで構築が進められた。2010年のNeo4jバージョン1.0リリース後、シリコンバレー進出。」といったところを頭に入れておくこととする。*

##現在

### ライセンス
同じく、のた犬のうまい猫めしさんの
["WikipediaのNeo4jサイト翻訳してみた"](http://notainu.hateblo.jp/entry/2015/08/02/144932)から。

> Neo4j comes in 3 editions: Community, Enterprise, and Government. It is dual-licensed: GPLv3 and AGPLv3 / commercial. The Community Edition is free but is limited to running on 1 node only due to the lack of clustering and is without hot backups.[7] The Enterprise Edition (which requires buying a license unless the application built on top of it is open-sourced) unlocks these limitations allowing for clustering, hot backups and monitoring. 

> Neo4jは、コミュニティ版、エンタープライズ版、ガバメント版の３つのエディションがあります。GPLv3、AGPLv3のデュアルライセンスと商用ライセンスです。コミュニティ版は無料ですが、オンラインバックアップ、クラスタリング機能が無く、1ノードに制限されています[7]。 エンタープライズ版（アプリケーションをオープンソースにしない限り、ライセンスを購入する必要があります）は、オンラインバックアップ、クラスタリング機能、モニタリング機能を持ち、1ノード制限がありません

*メモ : オープンソースのアプリケーションでは、ライセンス購入せずにエンタープライズ版を使える。*

###グラフデータベースの今と、Neo Technology社

jp.techcrunch　の記事["人気のグラフデータベースにいよいよ大企業が進出の兆し、トップ企業Neo Technologyの外堀城壁強化策を見る"]
(http://jp.techcrunch.com/2015/10/22/20151021neo-technology-ready-to-take-on-competition-in-graph-database-market/)が興味深かった:

```
データベースの人気を調べているWebサイトDB-Enginesのデータによると、2014年に成長率がいちばん高かったデータベースがグラフデータベースだ。

DB-EnginesによるとNeo TechnologyのNeo4jはグラフデータベースのトップシェア製品だが、同社はその地位に満足していない。それどころか、今ではOracleやMicrosoftのような大企業がグラフデータベースに進出しようとしているし、AmazonやHPなどもその後を追おうとしている。

それは、グラフデータベースがこのところいよいよ、エンタプライズの世界で離陸しようとしているからだ。企業のデータ集合においても最近では、事項間の論理的な関係を見出そうとするニーズが、高まっているのだ。
...今後もトップの座を維持し続けるための切り札のひとつがオープンソースで、Neo4jもまさにそれだが、さらに同社は今週、他社製のグラフデータベースとの互換性を実現するツールopenCypherをリリースした。

“Cypherはうち固有の製品だが、他社が利用されてもかまわない”、とEifremは語る。彼のその姿勢は、必ずしも愛他精神からではない。さまざまなベンダのグラフデータベース製品間のコミュニケーション能力は、顧客にとってきわめて重要だから、既存システムとの互換性を心配していた顧客も今後徐々にNeoのユーザになる、と彼は見ている。
...最近バージョン2.3にアップグレードしたNeo4jは、かなり抜本的なアップデートにより、余裕をもってビッグデータを扱えるようになった。

以上、いくつかの新しい基本的な取り組みにより同社は、これからいよいよ押し寄せてくるであろう大企業からの攻勢に耐え、グラフデータベースにおけるトップの座を守りぬき、彼らとの差をさらに大きく開けようとしている。

Neo Technologyはこれまで、4410万ドルを調達している。
```

#3) どこから使いはじめようか？

##何に使いたいのか。
neo4j社のサイトにいくつものユースケースがアップされている。
英語だが図示も多くわかりやすい。そこから興味を絞り込んでいき、Neo4Jをどこから使いはじめるか(あるいは使わないか)を判断するのが良い気がする。
自分の場合、グラフ構造に対する検索に興味がある:
http://neo4j.com/use-cases/graph-based-search/

 あと、IoT関係。ヘルスケア機器とかネットワーク家電などで相互に何かする、とかあるのでは...*(考え中)*
http://codezine.jp/article/detail/9000

##他社製のグラフデータベースとの互換性を実現するツールopenCypher
Neo4Jを使いはじめる場合、今後を考えると、openCypherの活用は必須だろう。
CF.
http://codezine.jp/article/detail/9046

##Githubで[neo4jタームでスター数順に検索してみる](https://github.com/search?o=desc&q=neo4j&s=stars&type=Repositories&utf8=%E2%9C%93)。
３０００強のリポジトリのうち、１００スター以上のものは４０弱で、
nodejs,ruby, python, PHP, java,Go,scala,.NET,clojure...といった言語向けのものがある。

とりあえず、興味のある言語で行けば良いと思うのだが、気になったものをいくつか。
### 本格派:Structr (java)
https://github.com/structr/structr

>Structr (pronounce it like 'structure') is a Java framework for mobile and web applications based on the graph database Neo4j.

公式サイトが気合入っている。補完が効く開発環境なども提供されているとのこと。
https://structr.com/

JVM言語で開発する場合の情報はneo4jサイトにもある。
http://neo4j.com/developer/java/

###安心のneo4jrb (ruby)
継続的に開発・メンテされており、本家サイトの解説もわかりやすい。
https://github.com/neo4jrb/neo4j
http://neo4jrb.io/
Rails使いはまずはこれなのだろう。

###本家サイトで紹介されているseraphなど (node.js)
ちょっと悩ましい感じだったのが、nodejsでneo4jを使うシナリオ。
コミット状況からは、決定打的なものはgithub上で見当たらなかった。

本家サイトの助けを借り、
http://neo4j.com/developer/javascript/
こちらに辿り着いた。ドキュメントは結構頑張ってくれている。
https://github.com/brikteknologier/seraph

あと、最近頑張っているのはこちらか。
https://github.com/philippkueng/node-neo4j

個人的に気になったのは、koa+react+neo4jで CMSをつくろうとしたこちら:
https://github.com/plouc/yuzu
1年前に挫折してしまっているようだが、時期がちょっと早かったか、、、

#4)自分はSpring Bootから、かな。
新しめのjavaベースのエンタープライズ志向のデータベース、となるといかにもjavaのSpringベースの取り組みがいろいろとありそうに思う。

Spring本家 GETTING STARTED
Accessing Data with Neo4j:
https://spring.io/guides/gs/accessing-data-neo4j/

Spring Data Neo4j:
https://github.com/spring-projects/spring-data-neo4j

```java

@NodeEntity
class Person {
    @Indexed
    private String name;

    @RelatedTo(direction = Direction.BOTH, elementClass = Person.class)
    private Set<Person> friends;

    public Person() {}
    public Person(String name) { this.name = name; }

    private void knows(Person friend) { friends.add(friend); }
}

Person jon = new Person("Jon").persist();
Person emil = new Person("Emil").persist();
Person rod = new Person("Rod").persist();

emil.knows(jon);
emil.knows(rod);

// Persist created relationships to graph database
emil.persist();
.....
```
 なるほど、グラフっぽい！
 

先人の取り組み:
http://qiita.com/rubytomato@github/items/c0c7a9cc8121aa4655f0
非常に詳しく解説してくださっていて、ありがたやありがたや。