「7つのデータベース 7つの世界」第7章の学習のために、Neo4jをインストールします。
7つのデータベース 7つの世界
- PotgreSQL
- Riak
- HBase
- MongoDB
- CouchDB
- Neo4j
- Redis
書籍で使っているNeo4jのバージョンは、1.7(p234のneo4j-enterprise-1.7-unix.tar
から)
最新バージョンは、4.0.4。
Enterprise Editionの1.9.7をダウンロードできたので、これを使います。
最初の1行「g.V」を入力するまでが大変だったよ。
慣れている人は、Tinkerpopでgremlinサーバを導入して、neo4jに接続するみたいよ。
何を言っているのか、わからないよ...
インストール
Neo4j 1.9.7
書籍ではNeo4j 1.7を使っていて、Web UIのConsoleでgremlinを入力できます。
Neo4j 4.0.4とNeo4j 2.3.12を試したところ、 Web UIのコンソールはCypher入力だけで、gremlin入力できませんでした。
Neo4j 1.9.7 を試したところ、書籍と同じWeb UIで、gremlin入力ができました。ただし、Oracle Java 1.7またはOpenJDK 1.7が必要です。
Mac OS X / Linux
https://neo4j.com/artifact.php?name=neo4j-community-1.9.7-unix.tar.gz 44MB
https://neo4j.com/artifact.php?name=neo4j-enterprise-1.9.7-unix.tar.gz 48MB
Windows
https://neo4j.com/artifact.php?name=neo4j-community-1.9.7-windows.zip 38MB
https://neo4j.com/artifact.php?name=neo4j-enterprise-1.9.7-windows.zip 41MB
Openjdk 1.7
https://jdk.java.net/java-se-ri/7
oracle java 1.7ではWARN表示なく起動しました。openjdk 1.7 ではWARN表示されましたが、起動しました。openjdk 8、openjdk 11でも同じWARN表示でしたが、起動できませんでした。
01:22:47.765 [main] WARN org.neo4j.kernel.info.JvmChecker - You are using an unsupported Java runtime. Please use Oracle(R) Java(TM) Runtime Environment 7.
Neo4j 4.0.4
今回の学習では使いませんでしたが、作業メモとして残しておきます。
Mac OS X 10.15.4、Ubuntu 18.04にインストールできました。Windows 10は試していませんが、同じ要領でインストールできると思います。
https://neo4j.com/download-center/#community を表示して、Linux/Mac用のtar.gzファイルをダウンロードします。105MBありました。
~/Dowloads/ の下に展開します。
$ cd ~/Downloads
$ tar xzf neo4j-community-4.0.4-unix.tar.gz
$ cd neo4j-community-4.0.4
Code language: Bash (bash)
PATHやJAVA_HOMEにopenjdk-11を設定しておきます。筆者は、Android StudioのjavaをPATHやJAVA_HOMEに設定しているので、一時的にopenjdk-11を指すように設定しました。
$ android_java=/snap/android-studio/current/android-studio/jre/bin:
$ android_java=${android_java/\//\\\/}
$ export PATH=${PATH/$android_java/}
$ export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
$ which java
/usr/bin/java
$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment (build 11.0.7+10-post-Ubuntu-2ubuntu218.04)
OpenJDK 64-Bit Server VM (build 11.0.7+10-post-Ubuntu-2ubuntu218.04, mixed mode, sharing)
Code language: Bash (bash)
起動します。
$ ./bin/neo4j start
Directories in use:
home: /home/aoki/Downloads/neo4j-community-4.0.4
config: /home/aoki/Downloads/neo4j-community-4.0.4/conf
logs: /home/aoki/Downloads/neo4j-community-4.0.4/logs
plugins: /home/aoki/Downloads/neo4j-community-4.0.4/plugins
import: /home/aoki/Downloads/neo4j-community-4.0.4/import
data: /home/aoki/Downloads/neo4j-community-4.0.4/data
certificates: /home/aoki/Downloads/neo4j-community-4.0.4/certificates
run: /home/aoki/Downloads/neo4j-community-4.0.4/run
Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j manual.
Started neo4j (pid 12240). It is available at http://localhost:7474/
There may be a short delay until the server is ready.
See /home/aoki/Downloads/neo4j-community-4.0.4/logs/neo4j.log for current status.
Code language: Bash (bash)
Webブラウザで、http://localhost:7474/ を表示します。Username=neo4j、初期Password=neo4j です。
Passwordを変更します。ここでは "password" にしました。
neo4jのweb画面が表示されました。
Neo4j Desktop 1.2.8 (Neo4j 4.0.3付き)
今回の学習では使いませんでしたが、作業メモとして残しておきます。
Windows用が545MB、Mac OS X用が150MB、Debian/Ubuntu用が610MBあります。進捗をみると1時間以上かかりそうなうえに、途中で失敗してしまいます。そこで、レンタルサーバのhetemlにsshログインして、hetemlサーバ上でwgetして、hetemlからローカルPCにscpしました。
Mac OS Xに、Neo4j Desktopをインストールすると、Neo4j enterprise 4.0.3とopenjdk-11.0.5がインストールされました。
Mac OS Xにはhome brewでopenjdk@11(11.0.7)をインストールしてありましたが、それとは別にopenjdk 11.0.5がインストールされました。場所は、/Users/aoki.makoto/Library/Application Support/Neo4j Desktop/Application/distributions/java/zulu11.35.13-ca-jdk11.0.5/
です。
書籍内コード
p224 ビッグデータ
http://download.freebase.com/datadumps/latest/browse/film/performance.tsv は404エラー。
2020年現在、Freebase.comはなく、Googleで最終データが公開されています。ただし、22GBもあります。
そこで、PostgreSQLの章で使った俳優データを代用します。すでにpostgresにインポートされているものとします。
sudo -u postgres psql book
--command="select a.actor_id, m.movie_id, a.name, m.title, 'dummy' AS dummy from movies_actors ma JOIN movies m ON ma.movie_id = m.movie_id JOIN actors a ON ma.actor_id = a.actor_id;" \
--no-align \
--field-separator=$'\t' \
--tuples-only \
>actors_movies.tsv
Code language: Bash (bash)
$ head actors_movies.tsv
3165 1 Mark Hamill Star Wars dummy
644 1 Carrie Fisher Star Wars dummy
1753 1 Harrison Ford Star Wars dummy
3768 1 Peter Cushing Star Wars dummy
4666 2 Tom Hanks Forrest Gump dummy
4094 2 Robin Wright Penn Forrest Gump dummy
1560 2 Gary Sinise Forrest Gump dummy
3489 2 Mykelti Williamson Forrest Gump dummy
2739 3 Kevin Spacey American Beauty dummy
247 3 Annette Bening American Beauty dummy
Code language: Bash (bash)
これで、importer.rb でインポートできます。俳優が4986件、映画が2861件あります。
$ ruby importer.rb actors_movies.tsv
Code language: Bash (bash)
追記
Freebase-easy-14-04-14から、actors_movies.tsvを作りました。
actors_movies.tsv.gz 14MB、117万件
p228 外部アルゴリズム
TinkerPopのGremlin consoleをダウンロードします。
$ wget http://ftp.jaist.ac.jp/pub/apache/tinkerpop/3.4.6/apache-tinkerpop-gremlin-console-3.4.6-bin.zip
$ unzip apache-tinkerpop-gremlin-console-3.4.6-bin.zip
$ cd apache-tinkerpop-gremlin-console-3.4.6
Code language: Bash (bash)
Gremlinコンソールを起動します。Java 1.7ではエラーでした。環境変数PATHやJAVA_HOMEをJava 1.8に切り替えました。
ちなみに、Gremlinコンソールのヘルプは「:help」、終了は「:quit」です。
$ ./bin/gremlin.sh
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin> :help
For information about Groovy, visit:
http://groovy-lang.org
Available commands:
:help (:h ) Display this help message
? (:? ) Alias to: :help
:exit (:x ) Exit the shell
:quit (:q ) Alias to: :exit
import (:i ) Import a class into the namespace
:display (:d ) Display the current buffer
:clear (:c ) Clear the buffer and reset the prompt counter
:show (:S ) Show variables, classes or imports
:inspect (:n ) Inspect a variable or the last result with the GUI object browser
:purge (:p ) Purge variables, classes, imports or preferences
:edit (:e ) Edit the current buffer
:load (:l ) Load a file or URL into the buffer
. (:. ) Alias to: :load
:save (:s ) Save the current buffer to a file
:record (:r ) Record the current session to a file
:history (:H ) Display, manage and recall edit-line history
:alias (:a ) Create an alias
:grab (:g ) Add a dependency to the shell environment
:register (:rc ) Register a new command with the shell
:doc (:D ) Open a browser window displaying the doc for the argument
:set (:= ) Set (or list) preferences
:uninstall (:- ) Uninstall a Maven library and its dependencies from the Gremlin Console
:install (:+ ) Install a Maven library and its dependencies into the Gremlin Console
:plugin (:pin) Manage plugins for the Console
:remote (:rem) Define a remote connection
:submit (:> ) Send a Gremlin script to Gremlin Server
:bytecode (:bc ) Gremlin bytecode helper commands
For help on a specific command type:
:help command
Code language: Bash (bash)
上のページの説明にしたがって、Gremlinコンソールに入って、Neo4j-Gremlinをインストールします。
gremlin> :install org.apache.tinkerpop neo4j-gremlin 3.4.6
==>Loaded: [org.apache.tinkerpop, neo4j-gremlin, 3.4.6] - restart the console to use [tinkerpop.neo4j]
Code language: Bash (bash)
「==>Loaded」メッセージが表示されたら、いったんGremlinコンソールを終了します。
gremlin> :quit
$
Code language: Bash (bash)
Gremlinコンソールを起動します。
$ ./bin/gremlin.sh
\,,,/
(o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin>
neo4jプラグインをアクティベートします。
gremlin> :plugin use tinkerpop.neo4j
==>tinkerpop.neo4j activated
Code language: Bash (bash)
Neo4jGraphオブジェクトを生成します。
gremlin> graph = Neo4jGraph.open('/home/aoki/Downloads/neo4j-enterprise-1.9.7/data/graph.db')
Error starting org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory, /home/aoki/Downloads/neo4j-enterprise-1.9.7/data/graph.db
Type ':help' or ':h' for help.
Display stack trace? [yN]
Code language: Bash (bash)
しかしエラーでした。ここで断念しました。
試しに、neo4j-community-4.0.4のdata/databasesを指定すると、Neo4jGraphオブジェクトを生成できました。
gremlin> graph = Neo4jGraph.open('/home/aoki/Downloads/neo4j-community-4.0.4/data/databases')
==>neo4jgraph[community single [/home/aoki/Downloads/neo4j-community-4.0.4/data/databases]]
gremlin> g = graph.traversal()
gremlin> g.addV('person').property('name', 'marko')
==>v[0]
gremlin> g.V()
==>v[0]
Code language: Bash (bash)