今日の猫めし
今日の猫めし
今日の猫めし
久しぶりに描いてみた
何だかもうわかんない感じで。
とりあえず、天狗舞は安いのから高いのまで旨いってことで。
GrapheneDBでNeo4jを動かしてみよう 1.アカウント取得とMovie Graphの動作確認
GrapheneDB(Graphenedb.com)はNeo4jがDaaS(Database as a Service)としてNeo4jをクラウドサービス上で実行できるサービスの一つです。プロバイダ(AWSかMicrosoft Azureか)、地域、プラン、Neo4jのVersionを選択すると、すぐ使えるようになりますし、一定サイズなら無料で利用できます。また、Neo4jのデータベースをブラウザ経由で操作するブラウザインタフェースがローカルPC、ローカルサーバにNeo4jをインストールして使うブラウザインタフェース画面と基本的なインタフェース、操作方法が同じであるため、まずはローカル環境で試してからクラウドに移行する場合に、管理が楽に行えます。
【GrapheneDBアカウント取得と初期データベース作成】
GrapheneDB公式サイト(http://www.graphenedb.com/)の「Get Started Now,Free」ボタンを押します。
初めて登録する場合には、Sign up to GrapheneDB画面で、Eメールアドレス、パスワード、同じパスワード(確認用)を入力し、プライバシー条項を確認し、「Sign up」ボタンを押します。
登録が完了すると、Create your first database(最初のデータベース作成)画面に遷移します。
「Create database」(データベース作成)ボタンを押すと、データベースの新規作成画面に遷移します。ここではデータベースのプランを選びます。2015年9月時点で、選択可能な項目、内容は以下の通りです。
- PROVIDER AND REGION(プロバイダーと地域):PROVIDERはAmazon Web Services、Microsoft Azureから選択できます。REGIONは、選択したPROVIDERによって変わり、Amazon Web Servicesの場合は、US East、US West、EU、Microsoft Azureの場合はNorth Europe、East US2から選択できます。
- データベースの目的とスペック:目的は、Hobby、Standard(Amazon Web Servicesの場合はPerformanceも加えた3つ)から選択でき、Hobbyはノードと関係性の数、Standard、PerformanceはRAMとストレージのサイズで、価格が決まります。
- Configure your database:Neo4jのVersion選択、データベース名の設定ができます。
ここでは、Amazon Web Services、US East、HobbyのSandbox(1K nodes/10K relations FREE)の無償Sandbox版、Neo4jは最新2.2.5を選択し、DATABASE NAMEにはtestdbと入力し、「Create database」ボタンを押します。
【ブラウザインタフェースの利用とMovie Graphデータベース情報挿入】
次の画面(ログイン後、データベース名をクリックしても移動できます)では、新しく作ったデータベース(例ではtestdb)の使用容量、現在のノード数やリレーションシップ数の確認ができます。
下のToolsの右にある「Launch」ボタンを押すと、ローカルPCのOS上にNeo4jをインストール後に起動、操作できるブラウザインタフェース画面と同様な画面で、Neo4jの操作を行うことができます。
ブラウザの上に「Hello and thanks for downloading Neo4j! Help us make Neo4j even better by sharing non-sensitive data. Would that be OK? (こんにちは、そしてNeo4jをダウンロードしていただきありがとうございます。より良いサポートのために機密性がないデータを共有してもよろしいですか?」と表示されている場合、「Yes, I'm happy to help!」(許可します)、「Sorry no, but good luck」(許可しません)のどちらかを選択し、画面から消しておきましょう。ここでは「Yes, I'm happy to help!」(許可します)をクリックします。
表示されている3つのメニューから、「Jump into code」(コードにジャンプ)の下、「Write Code(コードを書く)」をクリックし、「Write Code」(コードを書く)」として表示される3つのメニューから「Movie Graph」(映画グラフ)の下、「Create a graph」(グラフを作る)をクリックすることで、Movie Graphチュートリアルを試してみたり、サンプルデータベースを作成し、サイファークエリを試してみることもできます。
ちなみに、Movie Graphのチュートリアルに従ってデータベースにデータを登録後、GrapheneDBのメインページに戻ってリロードすると、合計2MB、ノード171個、リレーションシップ253個のリソースを使ったことが分かります。
【GraheneDB 各メニュー画面】
GrapheneDBにログイン後のメニュー画面からは、以下のメニューが選択できます。
- Overview:データベースサイズ等を確認できる初期画面
- Connection:データベースに接続するためのREST URL、REST USERNAME、REST PASSWORDの確認、REST driver設定が行えます。また、curl、PHP、Ruby、Python等の言語から接続する場合のサンプルコードを確認できます。
- Admin:データベースのリセット、エクスポート、リストア、データベース削除等が行えます。
- Configure:右側にある「Edit configuration」ボタンを押すと、データベースの設定を変更できます。自動でインデックスを付けたり(デフォルトは手動)、読み取り専用モードに変えたり(デフォルトは読み書き)することができます。有料のプランの場合には、メモリ設定等も行えます。
- Backups:有料のStandardかPerformanceプランの場合、自動バックアップスケジュールを組むことができます。
- Plugins:有料のDeveloperプラン、それより高いプランの場合、利用できます。
- Logs:ログファイル(messages.log、neo4j-0.0.log)の閲覧、ダウンロードができます。
Java女子部セミナー「数値型おさらい&金勘定ことはじめ(BigDecimal入門、Money and Currency API紹介)」宮川拓氏
- イベント情報:https://javajo.doorkeeper.jp/events/25312
- 講師:JJUG幹部 宮川拓氏 Kinkという言語を作って公開しているらしい。http://www.slideshare.net/miyakawataku/kink-jvm
- 今日の資料:
- double、floatは計算が早い(コンピュータが使いやすい)型。近似値に丸められてしまう。二進の浮動小数点型。10進少数は各桁に10のn乗かけた数の和。10進の少数でぴったり表せる値を二進少数で表すと循環小数になる(無限に桁が続く)。double/floatは固定精度、有効桁数有限。
- floatの32bitの中身:符号、指数(小数点の場所)、仮数(固定有限)。仮数のけたしか扱えない。0.3を二進にすると無限になり、doubleは有限なので近似値になる。(資料P.12)
- double/floatで金勘定すると、intで定価1000円、7%引き(doubleで0.07)で売るとすると……。930円かと思いがちだが、929円になってしまう!! 値引き率がdoubleで0.07がすでに問題。集計(平均を見たい)とかリスク計算とか正確な金額がいらない場合以外は、BigDecimalクラスを使う必要がある。
- BigDecimal:10進浮動小数点数。10進少数が正確に表せ、金勘定に使える。内部的には整数値+スケール。整数値:任意桁数の10進のけたを表すBigInteger。(メモリが許す限り桁数が取れる。)スケール:小数点を右からいくつ動かすかのint。12345+スケール6は0.012345.-3は12345000。ただマイナスで書くときはあまりない。
12.345と12.34500は、数としては同じだが中身は違う。new BigDecimal("1.23")、BigDecimal.ValueOf(42L)のように定義。足し算、引き算は大きいほうのスケールに合わせて演算される。2.34+4.560=6.900(スケール3)。(スケールを合わせて整数値を足し合わせている。)掛け算ではスケールが足しあわされる。先程の例だと10.67040(スケール5)。 - 端数処理:setScale(新しいスケール、丸めモード)。3でスケール2で丸めFLOORなら3.00.1.7320を2でCEILINGなら1.74。CEILINGは切り上げ。HALF_UPなら四捨五入。UNNECESSARYは丸めが必要ならArthmeticException。(丸めが必要になることはなく、あればバグ、を示す場合。)
- round(MathContext)は最大精度を指定して丸めるので使えない。(整数値全体の桁数を指定する。)金勘定の場合はsetScale。1.234をroundで3指定だと1.23。56.789は56.7。0.0001は0.0001。
- new BigDecimal(0.07)はdouble扱い。"0.07"にしないとダメ。バグとりツールとか使うとひっかけてくれたりする。(このままではせっかくBigDecimalで書いてもまた929円になる。要注意。)
- 100と、33.3+66.7は、equalsで等しくならない。(スケールが異なるため。equalsはスケールが異なるとtrueにならない。)スケールを気にしないときにはcompareToを使う。(あるいはスケールを合わせて100を100.0にする。たぶんスケールを合わせたほうが良いのでは、とのこと。)
- 割り算:ゼロ除算、割り切れない、桁数大きい、という問題があるためあまり使わないほうがよい。代わりに除数の逆数をかける。(ただし逆数出すのに割り算使ってしまうと同じ。初めから別ルートで逆数にするか、あきらめるか。)金勘定のための割り算は、divide(除数、スケール、丸めモード)。
- 例:年間費用を12か月ごとに均等割りして、ひと月は小数点下2ケタまでに切り捨て、端数は最後の月に。→ 費用がマイナスの時には0の方向に丸めるか、-無限大の方向に丸めるか、が問題になる。(-0.123を-0.12か、-0.13か。)divide(BigDecimal.valueOf(12),2,RoundingMode.FLOOR)。subtract(月ごと費用.multiply(BigDecimal.valueOf(11)) ←プリミティブ型でないと、引き算、掛け算に、記号は使えない(コンパイルエラーになる)ので注意。
- JavaSE9で、Money and Currency APIができる。通貨換算(換算用プロバイダにアクセスして換算。MonetaryConversions.getExchangeRateProvider().getCurrencyConversion(米ドル));。Moneta換算プロバイダはあまりよくないので、自前で作るのが良い。
【質疑応答】
- 0.0001をスケール3「精度3(最大3ケタ)」(講師からご指摘いただきました。ありがとうございました&失礼しました)で丸めると0.0001になる理由は? →scaleは4。unscaledValue(スケールされていない整数値)は1。unscaledValueは1で丸める必要がないため元の数と同じになる。56.789は整数部分が56789で5ケタあるので、精度3だと多すぎるので56.7。多かったら切り捨てるが、少なくても追加するわけではない。
- SQLServerなど、データベースの場合も同じことが起こる? → 仕様が二進数なら起こるだろう。(DBによって違うかも。)
Neoclipse導入してみる(→失敗)
以下、2014/2/14あたりの記事のリリース忘れ。現状と少し違うこともあることはご了承ください。
****
Neo4j 2.1.7を入れたが円に数字しか出ない(設定で出る?)ので、別の方向から扱えないかと、Neoclipseを入れてみることにした。
ついうっかりNeoeclipseで検索してしまいそうになるけど、Neo+clipseなのね……。
公式サイト:https://github.com/neo4j-contrib/neoclipse
Neoclipse Windows for 64bit Java 68.5MB。
zipをダウンロードし、適当なところに解凍する。(例:D:\Neoclipse)
D:\Neoclipse\neoclipse-1.9.5にneoclipse.exeがあるのでダブルクリックすると開く。
左上の「NewConnection」アイコンをクリック。
Nameはなにか適当に「LocalDefault.graphdb」、URIはBrowseボタンを押して、先ほどNeo4jインストール時に作ったD:\Neo4j\default.graphdbを選択する。User、Passは空っぽ。(設定した覚えなし。)
左上に何かできている。右クリックし、「Start/Connect database」を選択。
何かエラー(java.lang.RuntimeExceptio: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@51b07392' was successfully initialized, but failed to start. Please see atached cause exception.:org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.StoreLockerLifecycleAdapter@51b072329' was successfully initialized, but failed to start. Please see attached cause exception.」
URIを「http://localhost:7474」に変えてみるが、「java.lang.RuntimeException: Error reading as JSON ": Error reading as JSON"」 エラー。ぬー。
neoclipseが1.9.5で、Neo4jが2.1.7なので、Versionの互換性がない? 設定が違う?? まぁ放置して次へ。
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)