Neo4jでポイント交換レートを計算していれば沖縄に行けたかもしれない話


経緯

今年の夏、どうしても沖縄旅行に行きたいと思い、所有している20000GポイントをA○Aマイルに交換しました。交換レートは30Gポイント=10マイルでしたので、6666マイルに交換できました。ところが、A○Aマイルで沖縄に行くには15000マイル必要で、マイルが全然足りませんでした。

Neo4jを使っていれば、、、という後悔からこの記事をかいています(フィクションです)。

状況   
所持金 0円
Gポイント 20000ポイント

Neo4jとは?

Neo4jがなにかについては、こちらを参考にさせていただきました。
https://www.creationline.com/lab/7168
https://neo4j.com/

前提条件

Neo4jを簡単に動かしてみたいので、Desktop版を利用しました。

環境 バージョン  
Mac 10.15.4
Neo4j Neo4j Desktop 1.3.3

環境構築

ダウンロード

こちらからダウンロード
https://neo4j.com/download-center/#desktop

インストール

dmgを展開してアプリケーションをApplicationディレクトリへコピーするだけ

プロジェクトの作成

Neo4j起動後に以下の手順でプロジェクトを作成します。
① Newをクリックする
② プロジェクト名を変更する
③ Add Database
④ Create a Local Database

⑤ DBMSNameとPasswordを設定して、Createする

マイル交換レートの登録

交換レート

今回以下のようにマイル交換レートを作成しました。
(こちら実在するポイントプログラムとは一切関係ありません)

From To     Cost 備考
GPoint AoAMile 0.333(10/30) 30Gポイント=10マイル
GPoint JoPoint 0.9(9000/10000) 10000Gポイント=9000Joポイント
JoPoint AoAMile 0.9(9000/10000) 10000Joポイント=9000マイル

Neo4jへの登録

これをNeo4jに登録するにはCypherクエリというクエリ言語を利用します。

CREATE (gpoint:Program {name: 'GPoint'}),
(jopoint:Loc {name: 'JoPoint'}),
(aoamile:Loc {name: 'AoAMile'}),
(gpoint)-[:Rate {cost: 0.9}]->(jopoint),
(gpoint)-[:Rate {cost: 0.333}]->(aoamile),
(jopoint)-[:Rate {cost: 0.9}]->(aoamile);

以下実際の手順です。
Databaseを起動して、「Open」をクリックするとNeo4jBrowserが立ち上がります。

Neo4jBrowserにCypherクエリを記述して実行ボタンをクリックすると、データの登録が完了します。

リレーションシップの確認

Relationship TypesのRateをクリックすると、関連するリレーションシップをグラフで確認することができます。

マイル交換の計算

今回20000GポイントをA○Aに交換したかったので、以下のようなクエリを作成して実行しました。

MATCH route = (:Program{name:"GPoint"})-[:Rate*]-(:Program{name:"AoAMile"})
RETURN route, 20000*REDUCE(cost=1, r in RELATIONSHIPS(route) | cost*r.cost) AS Score
ORDER BY Score;

実行後にTextタブをクリックすると、経路(Route)とその経路で交換した時のマイル数(Score)が表示されます。

これは便利。

反省

今回Neo4jをつかってマイルへ交換ルートを計算してみたところ、Joポイントを経由していれば、16200マイル(15000マイル以上)に交換できたので、沖縄に行くことができたということがわかりました、悔しいです! 

まとめ

Neo4jではノード間の経路を洗い出してくれるのがとても便利だなとおもいました。
また、Neo4jではGraph Data Science Libraryというのを追加することで、いろいろなアルゴリズムを使えるようになるようなので、こちらも試しつつNeo4jの使い所を理解していきたいとおもいます。

(参考)最短経路の算出とか便利そう
The Shortest Path algorithm
https://neo4j.com/docs/graph-data-science/current/alpha-algorithms/shortest-path/#algorithms-shortest-path-sample