のた犬のうまい猫めし

どら猫が作る、のた犬のための飯、略称、どら飯について語りつつ、各種技術、経済系セミナーに参加した報告、OSSいじってみた等のネタを入れていきます。更新情報はtwitterの@nota_inuにて。

Neo4j2.1.7インストール、試行

以下、2014/2/14あたりの記事のリリース忘れ。現状と少し違うこともあることはご了承ください。

【Neo4j2.1.7 Community版 Windows、exe版 インストール】

http://neo4j.com/ (公式サイト)の右側にある「Download Neo4j」リンクをクリック。

 

f:id:notainu:20150606001150p:plain

f:id:notainu:20150606001208p:plain


Enterpriseの30日FreeTrial版とCommunity版があるので、Community版をクリック。勝手にexeのダウンロードが開始される(2.1.7で66.9MB)。

f:id:notainu:20150606001315p:plain


exeをダブルクリックでインストール開始。「D:\Program Files (x86)\Neo4j Community」 にインストール。(デフォルトはC:\Program Files (x86)\Neo4j Community。)

f:id:notainu:20150606001338p:plain

f:id:notainu:20150606001352p:plain

 

f:id:notainu:20150606001410p:plain

 

f:id:notainu:20150606001427p:plain

 

f:id:notainu:20150606001440p:plain


インストール最後、「Run Neo4j Community」にチェックを入れてFinish。
Database locationが聞かれるので、D\Neo4j\default.graphdbフォルダを作成し、「D:\Neo4j\default.graphdb」にする。(デフォルトはC:\Users\nota\Documents\Neo4j\default.graphdb。)

f:id:notainu:20150606001543p:plain

 

f:id:notainu:20150606001603p:plain

ファイアウォールブロックメッセージが出るので、全部許可しておく。

f:id:notainu:20150606001618p:plain


startボタンを押すと、先ほどのフォルダに何やらいろいろ作られている。

f:id:notainu:20150606001701p:plain


小さな画面に「Neo4j is ready. Browse to http://localhost:7474」と表示されている。

f:id:notainu:20150606001723p:plain

クリックすると、何やらブラウザで画面が立ち上がる。

f:id:notainu:20150606001746p:plain


右上のロゴをクリックすると、Version、Location、サイズが表示される。作成時点で1.97MB。
その下の★をクリックし、Generalの「Create a node」をクリックすると、中央上のコンソール部分(?)に

// Create a node
CREATE (n {name:"World"}) RETURN "hello", n.name

Cypherクエリ(たぶん)が表示される。

f:id:notainu:20150606001816p:plain

 

右上の丸三角実行ボタンを押すと、Create 1 node。。とかで何か作られた。

f:id:notainu:20150606001927p:plain

 

f:id:notainu:20150606001954p:plain


★のGeneralの「Get some data」をクリックしても何か表示される。

f:id:notainu:20150606002020p:plain


その中の右下にあるYっぽいものを押すと、何かグラフィカルっぽいものが表示される。

真ん中にある●をクリックすると、プロパティ(Properties)が表示される。

f:id:notainu:20150606002042p:plain



Properties内の目アイコンをクリックすると、●の大きさ、色を変えることができるようだ。

f:id:notainu:20150606003415p:plain


日本語も使える様子。

// Create a node
CREATE (n {name:"世界"}) RETURN "はろー", n.name

 

f:id:notainu:20150606002109p:plain

◯iの下部にある「Classic UI」のWebadminクリックすると、http://localhost:7474/webadmin/ がブラウザで開く。Dashboardとか何かある。(……Classic UIってことは新しい版もある?)

f:id:notainu:20150606002526p:plain

f:id:notainu:20150606002542p:plain



http://www.omotenashi-mind.com/index.php/Neo4j%E3%81%A7%E5%AD%A6%E3%81%B6Graph_DB%E5%85%A5%E9%96%80
を参考に、Tom、Mary、KNOWSの関係を登録してみる。

CREATE (n:Person { name : 'Tom' })
CREATE (n:Person { name : 'Mary' })
MATCH (a:Person), (b:Person) WHERE a.name='Tom' AND b.name='Mary' CREATE (a)-[r:KNOWS]->(b)

f:id:notainu:20150606002619p:plain



中を確認したい場合、
MATCH (a:Person), (b:Person) WHERE a.name = 'Tom' AND b.name ='Mary' return a, b (上記URL)
MATCH (a)-[:`KNOWS`]->(b) RETURN a,b LIMIT 25 (ロゴの「Relationship types」の「KNOWS」をクリック)
MATCH (a)-[r]-(b) RETURN a,b LIMIT 25 (ロゴの「Relationship typesの「*」をクリック)

CREATE (n:Person { name : 'Jason' })
CREATE (n:Person { name : 'Rita' })
MATCH (a:Person), (b:Person) WHERE a.name='Jason' AND b.name='Tom' CREATE (a)-[r:LOVES]->(b)MATCH (a)-[r]-(b) RETURN a,b LIMIT 25

大分複雑になってきた。恋人の知り合いか。

f:id:notainu:20150606002714p:plain



MATCH (a:Person), (b:Person) WHERE a.name='Jason' AND b.name='Rita' CREATE (a)-[r:LOVES]->(b)

JasonがRitaとTomとに二股かけたw
住んでいる場所をつなげてみるか。2つのlabelをつける場合はカンマ区切りで良さそう。

CREATE (n:Station { name : 'Chicago', country: 'America'});
CREATE (n:Station { name : 'NewYork', country: 'America'});
CREATE (n:Station { name : 'Tokyo', country: 'Japan'});

TomはChicagoに1979年から住んでいる。
MATCH (a:Person), (b:Station) WHERE a.name='Tom' AND b.name='Chicago' CREATE (a)-[r:LIVE {since:1979}]->(b)
MaryはChicagoに2000年から、JasonはNewYorkに2003年から、RitaはChicagoに2001年から、RitaはTokyoに2010年から住んでいる。
MATCH (a:Person), (b:Station) WHERE a.name='Mary' AND b.name='Chicago' CREATE (a)-[r:LIVE {since:2000}]->(b)
MATCH (a:Person), (b:Station) WHERE a.name='Jason' AND b.name='NewYork' CREATE (a)-[r:LIVE {since:2003}]->(b)
MATCH (a:Person), (b:Station) WHERE a.name='Rita' AND b.name='Chicago' CREATE (a)-[r:LIVE {since:2001}]->(b)
MATCH (a:Person), (b:Station) WHERE a.name='Rita' AND b.name='Tokyo' CREATE (a)-[r:LIVE {since:2010}]->(b)
ChicagoとNewYorkには道があり、10単位離れている。
MATCH (a:Station), (b:Station) WHERE a.name='Chicago' AND b.name='NewYork' CREATE (a)-[r:ROAD {distance:10}]->(b)
ChicagoとTokyoには道があり、120単位離れている。
MATCH (a:Station), (b:Station) WHERE a.name='Chicago' AND b.name='Tokyo' CREATE (a)-[r:ROAD {distance:120}]->(b)
NewYorkとTokyo間は150単位。
MATCH (a:Station), (b:Station) WHERE a.name='NewYork' AND b.name='Tokyo' CREATE (a)-[r:ROAD {distance:150}]->(b)

おー、さらに複雑になってきた。

f:id:notainu:20150606002854p:plain

 

f:id:notainu:20150606003319p:plain



そろそろselectしたい。Chicagoに住んでいる人手を上げろ!
MATCH (a)-[:LIVE]->(b) where b.name = 'Chicago' return a,b

f:id:notainu:20150606003136p:plain


Where句のand、orはそのままでOKらしい。ChicagoかTokyoに住んでいる人。
MATCH (a)-[:LIVE]->(b) where b.name = 'Chicago' or b.name = 'Tokyo' return a,b

f:id:notainu:20150606003219p:plain


2000年より前からChicagoに住んでいる人を取りたいのだけど0件。どうすれば良い?
MATCH (a)-[:LIVE]->(b) where b.name = 'Chicago' and b.since < 2000 return a,b ←NG

MATCH (a)-[person:LIVE {since:2000}]->(b) where b.name = 'Chicago'return a,b ←2000年限定ならこれでOK
MATCH (a)-[LIVE {since:2000}]->(b) where b.name = 'Chicago' return a,b でもOK。)

↑Personに紐付いた数字であれば。Person.age>35のように指定できるようだ。(http://neo4j.com/docs/stable/query-sql-where.html


公式の言語仕様とか:
http://neo4j.com/docs/stable/cypher-query-lang.html


SQL QueryとCypher Queryとの差】

http://neo4j.com/docs/stable/query-sql-start.html
Personテーブルのnameフィールドのanakinの情報全部取ってこい。
SQL Query: SELECT * FROM "Person" WHERE name = 'anakin'
Cypher Query: MATCH (person:Person {name: 'anakin'} RETURN person

PersonテーブルのidとMailテーブルのperson_idが同じで、PersonテーブルのnameがAnakinの、EmailテーブルのすべてをPersonテーブルから取ってくる。
SQL Query: SELECT "Email".* FROM "Person" JOIN "Email" ON "Person".id = "Email".person_id WHERE "Person".name = 'Anakin'
Cypher Query: MATCH (person:Person { name: 'Anakin' })-[:email]->(email) RETURN email


TutorialsのDataModeling Examples使って勉強すれば良いのでは!?
http://neo4j.com/docs/stable/cypherdoc-linked-lists.html
(しかも、下に練習としてSQL文発行できるテキストエリアあるし。)

http://www.slideshare.net/who_you_me/neo4j-2?related=1 P.27
辺の向きを指定:(n)-->(m)
向きを考慮しない:(n)---(m)
深さを指定:(n)-[*1-6]->(m)