Neo4j2.1.7インストール、試行
以下、2014/2/14あたりの記事のリリース忘れ。現状と少し違うこともあることはご了承ください。
【Neo4j2.1.7 Community版 Windows、exe版 インストール】
http://neo4j.com/ (公式サイト)の右側にある「Download Neo4j」リンクをクリック。
Enterpriseの30日FreeTrial版とCommunity版があるので、Community版をクリック。勝手にexeのダウンロードが開始される(2.1.7で66.9MB)。
exeをダブルクリックでインストール開始。「D:\Program Files (x86)\Neo4j Community」 にインストール。(デフォルトはC:\Program Files (x86)\Neo4j Community。)
インストール最後、「Run Neo4j Community」にチェックを入れてFinish。
Database locationが聞かれるので、D\Neo4j\default.graphdbフォルダを作成し、「D:\Neo4j\default.graphdb」にする。(デフォルトはC:\Users\nota\Documents\Neo4j\default.graphdb。)
ファイアウォールブロックメッセージが出るので、全部許可しておく。
startボタンを押すと、先ほどのフォルダに何やらいろいろ作られている。
小さな画面に「Neo4j is ready. Browse to http://localhost:7474」と表示されている。
クリックすると、何やらブラウザで画面が立ち上がる。
右上のロゴをクリックすると、Version、Location、サイズが表示される。作成時点で1.97MB。
その下の★をクリックし、Generalの「Create a node」をクリックすると、中央上のコンソール部分(?)に
// Create a node
CREATE (n {name:"World"}) RETURN "hello", n.name
とCypherクエリ(たぶん)が表示される。
右上の丸三角実行ボタンを押すと、Create 1 node。。とかで何か作られた。
★のGeneralの「Get some data」をクリックしても何か表示される。
その中の右下にあるYっぽいものを押すと、何かグラフィカルっぽいものが表示される。
真ん中にある●をクリックすると、プロパティ(Properties)が表示される。
Properties内の目アイコンをクリックすると、●の大きさ、色を変えることができるようだ。
日本語も使える様子。
// Create a node
CREATE (n {name:"世界"}) RETURN "はろー", n.name
◯iの下部にある「Classic UI」のWebadminクリックすると、http://localhost:7474/webadmin/ がブラウザで開く。Dashboardとか何かある。(……Classic UIってことは新しい版もある?)
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)
中を確認したい場合、
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
大分複雑になってきた。恋人の知り合いか。
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)
おー、さらに複雑になってきた。
そろそろselectしたい。Chicagoに住んでいる人手を上げろ!
MATCH (a)-[:LIVE]->(b) where b.name = 'Chicago' return a,b
Where句のand、orはそのままでOKらしい。ChicagoかTokyoに住んでいる人。
MATCH (a)-[:LIVE]->(b) where b.name = 'Chicago' or b.name = 'Tokyo' return a,b
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)