読者です 読者をやめる 読者になる 読者になる

雑多なノート

プログラミング初心者がメモとかを書きます。基礎的なこともメモとして。偏食系のアニオタ。

Neo4jを弄ってみた

なんとかブラウザからアクセスできるようになったのでいろいろいじってみた

ログインした画面の上にあるボックスにクエリをそのままぶち込めば実行できるっぽい
気軽で便利かも
シェルみたいに履歴機能ついてるし色つけもやってくれるのがうれしい

ノードの作成
CREATE (a:Person{name:"Alice",From:"Britain"})

これでイギリス出身のアリスノードができるらしい
aは後続の文で使うための変数みたいなもので要らなかったら省略しても良いらしい

CREATE (:Person{name:"Alice",From:"Britain"})

さらにラベルも要らなかったら省略してもいいっぽい

CREATE ({name:"Alice",From:"Britain"})

ちなみに無ければ追加,あったら更新をしてくれるMERGEという素敵なものもあるらしい

表示

MATCH(n) RETURN n

とりあえずこれで全部のノードを表示してくれる
MATCH(n)が検索でRETURN nが表示って役割らしい
MATCHだけで実行したらなんか処理しろやって怒られた
カッコいいグラフで表示してくれるのでなんかきもちい
f:id:vayacico:20161127164549p:plain

ノードの検索
MATCH(n) WHERE n.name="Alice" RETURN n

なんとなくSQLっぽい感じかも

MATCH(n) WHERE n.From="Britain" OR n.From="Japan" RETURN n

ORもANDも使える

MATCH (p)-[:friends]->(q) WHERE p.name="Alice"  RETURN q

関係も含めてこんな使い方もできるらしい
パッと見で分かりやすくていいかも
なんでMATCHだけ括弧ついてるのか疑問だったけど()はノードで[]は関係って意味だったみたい

関係の設定
MATCH(p) WHERE p.name="Alice" MATCH(q) WHERE q.name="Karen" CREATE (p)-[:friends]->(q)

これでアリスからカレンへの関係を作成できた
pに検索結果を格納,qに検索結果を格納,p->qの関係を作成って流れだと思う
ちなみにCREATE文はカンマで区切って複数いっぺんに作れるみたい

MATCH(p) WHERE p.name="Alice" MATCH(q) WHERE q.name="Karen" CREATE (p)-[:friends]->(q),(q)-[:friends]->(p)
属性の更新・追加
MATCH(r) WHERE r.name="Alice" SET r.at="Japan"

属性がなければ追加されるらしい

ノードの削除
MATCH(n) WHERE n.name="Alice" DELETE n

検索して削除
わかりやすい
ちなみに関係が存在するノードは消せなくてエラーになる

org.neo4j.kernel.api.exceptions.ConstraintViolationTransactionFailureException: Cannot delete node<553>, because it still has relationships. To delete this node, you must first delete its relationships.

エラーも分かりやすくていい

関係の削除
MATCH(n)-[r]->(p) WHERE n.name="Alice"  DELETE r

関係にも変数を付けられるのでそれを使って削除

感想

思ってたよりかなり分かりやすい
複雑なことをやろうとすると難しいのかもしれないけど

neo4jにアクセスできない

インストールには成功した(?)けどなぜかブラウザからアクセスできなくて悩んでたら設定ファイルの問題だったっぽい
f:id:vayacico:20161123101859j:plain
外部からのアクセスは設定ファイルの変更が必要なのは知ってたけどポートフォワーディングしてもダメなのは意外だった
Neo4jをはじめよう - (1) インストール - ふゆみけ〜おかわり〜
これを参考に設定した
設定ファイルの場所とかコメントアウトする記述が違ったけど勘でやったらなんか上手くいった
f:id:vayacico:20161123102040j:plain

ログイン成功
あとはWarningを解決せねば



f:id:vayacico:20161123102215j:plain

neo4jのインストール

グラフデータベースで遊んでみたくなったのでインストールしてみた

 yumでも入れられるみたいだけど実験版?が入るだのなんだの不穏なことが書かれてたので公式からtar.gzを落としてインストールした

Download Neo4j - Neo4j Graph Database

Community Editionなるものをダウンロードした

色々書いてあるけど大規模なデータベースに向かないとかサポートがないとからしい

あまり関係ないかな

 

インストールといってもファイル展開するだけみたいで楽チンだった

初めて知ったけど自分でインストールしたファイルって/opt以下に置くらしい

WindowsのあのフォルダはUNIX/Linuxで言えばあそこだ - Qiita

 

/opt/neo4jに展開してインストール完了

 

って思ったらJDK入れろと怒られたので最新版を入れてもう一回起動

 

起動には成功したっぽいけど何やらWarningが

[vayacico@lavie bin]$ ./neo4j start

Starting Neo4j.
WARNING: Max 1024 open files allowed, minimum of 40000 recommended. See the Neo4j
manual.
Started neo4j (pid 3308). By default, it is available at http://localhost:7474/
There may be a short delay until the server is ready.
See /opt/neo4j-community-3.0.7/logs/neo4j.log for current status.

 

 

ファイルいっぱい開きたいけどセキュリティの設定で出来ないから変えてくれーってことか

起動には成功してるっぽいし面倒なので後でやろう……

Play Frameworkで「Database 'default' is in an inconsistent state!」エラー

エラー

Play Frameworkからデータベース作成時にエラーが発生.

Modelを作ると自動的にテーブルを更新してくれる便利な機能を使ったらエラーがおきた.

f:id:vayacico:20160218230438p:plain

エラーメッセージ見ると文法エラーっぽい.

自分でSQL文書いたわけじゃないんだけどな….

解決法

調べてみたらModelを継承したクラスのTimestamp型フィールドに型を指定するアノテーションを付けていなかったのが原因らしい.

型を明示的に指定しろってことなのだろうか.

変更前

@UpdatedTimestamp
public Timestamp login_at;

変更後

@Column(columnDefinition = "datetime")
@UpdatedTimestamp
public Timestamp login_at;

最近やっと少しずつフレームワークのありがたみが実感できるようになってきた.

こういう機能はやっぱり便利.

参考

java - Storing datetime in a mysql server play framework - Stack Overflow

バックスペースが^Hになる

activatorを終了した後からバックスペースが^Hになってしまった.

以下のコマンドでとりあえず対症療法的には解決.

$ stty erase ^H

puttyで試したら大丈夫だったので,rloginだけで起きる問題かもしれない.

毎回打たなくてはいけないからちょっと面倒.

根本的に治す方法ないかなー.

Play Frameworkでコンパイル時にUnable to set localhostエラー

エラー

Windows環境では何もエラー起きなかったがCentOSに持っていったときにエラーが起きた.

サーバー起動後のコンパイル時に起きてるっぽい.

[error] - net.sf.ehcache.Cache - Unable to set localhost. This prevents creation of a GUID. Cause was: sakura1: sakura1: unknown error
java.net.UnknownHostException: rabbit: rabbit: unknown error
        at java.net.InetAddress.getLocalHost(InetAddress.java:1505) ~[na:1.8.0_71]
        at net.sf.ehcache.Cache.<clinit>(Cache.java:214) ~[ehcache-core.jar:na]
        at net.sf.ehcache.config.ConfigurationHelper.createCache(ConfigurationHelper.java:296) [ehcache-core.jar:na]
        at net.sf.ehcache.config.ConfigurationHelper.createDefaultCache(ConfigurationHelper.java:219) [ehcache-core.jar:na]
        at net.sf.ehcache.CacheManager.configure(CacheManager.java:722) [ehcache-core.jar:na]
        ...

作業

理由はよく分からないけど,調べてみたらホスト名がローカルホストに解決できないのが原因らしい. ホスト名とループバックアドレスの宣言を/etc/hostsに追記して解決.

$ sudo bash
# echo "127.0.0.1 localhost sakura1" >> /etc/hosts

参考

configuration - Play Framework GUID - Stack Overflow

Play Frameworkのインストール

Play Frameworkをインストールしてみた.

作業環境

作業

Play FrameworkはTypesafe Activatorというツールを通して利用するらしい.

まずは,公式サイトからActivator distributionをダウンロード,解凍する.

Build Reactive Applications with Typesafe Activator | @typesafe

$ wget https://downloads.typesafe.com/typesafe-activator/1.3.7/typesafe-activator-1.3.7.zip
$ unzip typesafe-activator-1.3.7.zip

読み込みと書き込み権限がある場所に展開する必要があるらしいので何も考えずにホームディレクトリに展開した.

いちいちディレクトリ指定するのが面倒なので展開したディレクトリにパスを通す.

.bash_profileに以下を追記した.

PATH=$PATH:/home/USERNAME/activator

一度ログアウトしてログインしたあと,コマンドが起動できることを確認してインストール作業終了.

activator -help  

新規アプリケーションは以下のコマンドで作成できる.

activator new APPNAME play-java

するとカレントディレクトリにアプリケーション名と同じディレクトリが作成される.

参考

Installing

パス(PATH)の確認と設定方法は? - Pocketstudio.jp Linux Wiki