のた犬のうまい猫めし

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

デジタルで復活してみた

Jump Paintとかいう漫画用ソフトが無料で使えるようになったという記事を発見し、のたどらデジタル編でも作ってみるかと思い久しぶりに復活。

 Panasonic CF-MX3を買った理由は、ペンついていて直接ディスプレイに描けることなのに、この機能つかったことほとんどないのよな。

 

 

f:id:notainu:20170708201016p:plain

 

そして今日の日本酒は、

純米吟醸よのひかり。Kと大きく描かれている。飲みやすく、軽めの華やかさ。

 久しぶりに猫めしの写真撮ったら大失敗。

 

 f:id:notainu:20170708201833j:plain

 f:id:notainu:20170708201918j:plain

GrapheneDBでNeo4jを動かしてみよう 1.アカウント取得とMovie Graphの動作確認

 GrapheneDB(Graphenedb.com)はNeo4jがDaaS(Database as a Service)としてNeo4jをクラウドサービス上で実行できるサービスの一つです。プロバイダ(AWSMicrosoft Azureか)、地域、プラン、Neo4jのVersionを選択すると、すぐ使えるようになりますし、一定サイズなら無料で利用できます。また、Neo4jのデータベースをブラウザ経由で操作するブラウザインタフェースがローカルPC、ローカルサーバにNeo4jをインストールして使うブラウザインタフェース画面と基本的なインタフェース、操作方法が同じであるため、まずはローカル環境で試してからクラウドに移行する場合に、管理が楽に行えます。


【GrapheneDBアカウント取得と初期データベース作成】


GrapheneDB公式サイト(http://www.graphenedb.com/)の「Get Started Now,Free」ボタンを押します。

f:id:notainu:20150925004331p:plain

初めて登録する場合には、Sign up to GrapheneDB画面で、Eメールアドレス、パスワード、同じパスワード(確認用)を入力し、プライバシー条項を確認し、「Sign up」ボタンを押します。

f:id:notainu:20150925004423p:plain

 

登録が完了すると、Create your first database(最初のデータベース作成)画面に遷移します。

f:id:notainu:20150925004420p:plain

 


「Create database」(データベース作成)ボタンを押すと、データベースの新規作成画面に遷移します。ここではデータベースのプランを選びます。2015年9月時点で、選択可能な項目、内容は以下の通りです。

 

  • PROVIDER AND REGION(プロバイダーと地域):PROVIDERはAmazon Web ServicesMicrosoft 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」ボタンを押します。

f:id:notainu:20150925004417p:plain

 

f:id:notainu:20150925004415p:plain

 

 

【ブラウザインタフェースの利用とMovie Graphデータベース情報挿入】

 次の画面(ログイン後、データベース名をクリックしても移動できます)では、新しく作ったデータベース(例ではtestdb)の使用容量、現在のノード数やリレーションシップ数の確認ができます。

f:id:notainu:20150925004411p:plain


 下のToolsの右にある「Launch」ボタンを押すと、ローカルPCのOS上にNeo4jをインストール後に起動、操作できるブラウザインタフェース画面と同様な画面で、Neo4jの操作を行うことができます。

f:id:notainu:20150925004406p:plain

 

 

 ブラウザの上に「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!」(許可します)をクリックします。

f:id:notainu:20150925004405p:plain

f:id:notainu:20150925004402p:plain

 


 表示されている3つのメニューから、「Jump into code」(コードにジャンプ)の下、「Write Code(コードを書く)」をクリックし、「Write Code」(コードを書く)」として表示される3つのメニューから「Movie Graph」(映画グラフ)の下、「Create a graph」(グラフを作る)をクリックすることで、Movie Graphチュートリアルを試してみたり、サンプルデータベースを作成し、サイファークエリを試してみることもできます。

f:id:notainu:20150925004359p:plain

 

f:id:notainu:20150925004357p:plain

 

 

f:id:notainu:20150925004355p:plain

 

f:id:notainu:20150925004353p:plain

 

f:id:notainu:20150925004350p:plain

 

f:id:notainu:20150925004347p:plain

 

 ちなみに、Movie Graphのチュートリアルに従ってデータベースにデータを登録後、GrapheneDBのメインページに戻ってリロードすると、合計2MB、ノード171個、リレーションシップ253個のリソースを使ったことが分かります。

f:id:notainu:20150925004344p:plain

 

 


【GraheneDB 各メニュー画面】

 GrapheneDBにログイン後のメニュー画面からは、以下のメニューが選択できます。

  • Overview:データベースサイズ等を確認できる初期画面
  • Connection:データベースに接続するためのREST URL、REST USERNAME、REST PASSWORDの確認、REST driver設定が行えます。また、curlPHPRubyPython等の言語から接続する場合のサンプルコードを確認できます。

f:id:notainu:20150925004342p:plain

 

 

  • Admin:データベースのリセット、エクスポート、リストア、データベース削除等が行えます。
  • Configure:右側にある「Edit configuration」ボタンを押すと、データベースの設定を変更できます。自動でインデックスを付けたり(デフォルトは手動)、読み取り専用モードに変えたり(デフォルトは読み書き)することができます。有料のプランの場合には、メモリ設定等も行えます。

f:id:notainu:20150925004340p:plain

f:id:notainu:20150925004337p:plain

 

  • Backups:有料のStandardかPerformanceプランの場合、自動バックアップスケジュールを組むことができます。
  • Plugins:有料のDeveloperプラン、それより高いプランの場合、利用できます。
  • Logs:ログファイル(messages.log、neo4j-0.0.log)の閲覧、ダウンロードができます。

 

 

Java女子部セミナー「数値型おさらい&金勘定ことはじめ(BigDecimal入門、Money and Currency API紹介)」宮川拓氏

 

  • 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。

f:id:notainu:20150606022558p:plain


zipをダウンロードし、適当なところに解凍する。(例:D:\Neoclipse)
D:\Neoclipse\neoclipse-1.9.5にneoclipse.exeがあるのでダブルクリックすると開く。

f:id:notainu:20150606022611p:plain

f:id:notainu:20150606022632p:plain

f:id:notainu:20150606022645p:plain

左上の「NewConnection」アイコンをクリック。

f:id:notainu:20150606022701p:plain


Nameはなにか適当に「LocalDefault.graphdb」、URIはBrowseボタンを押して、先ほどNeo4jインストール時に作ったD:\Neo4j\default.graphdbを選択する。User、Passは空っぽ。(設定した覚えなし。)

f:id:notainu:20150606022732p:plain


左上に何かできている。右クリックし、「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.」

f:id:notainu:20150606022751p:plain

f:id:notainu:20150606022801p:plain

f:id:notainu:20150606022811p:plain



URIを「http://localhost:7474」に変えてみるが、「java.lang.RuntimeException: Error reading as JSON ": Error reading as JSON"」 エラー。ぬー。

f:id:notainu:20150606022826p:plain

f:id:notainu:20150606022837p:plain


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」リンクをクリック。

 

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)