論文管理って結局どうしたらいいの? – Neo4jを使ってみる

読んだ論文の管理にMendeleyを使っています。自分の論文の参考文献リスト作成にはとても便利なのですが、論文や著者同士の関係性を調べるのには不便です(例「論文Aは論文Bの参考文献」「論文Aの第1著者aは論文Cの第2著者」)。

Connected PapersというサイトはグラフDB(データベース)を使って引用されている論文同士をグラフで可視化します。

https://www.connectedpapers.com/

Connected Papersより

同サイトで”football”と検索してでてきた論文から適当に一つ選んでグラフを作成しました。

素晴らしいサービスです。これに感銘を受けて、自分が読んだ論文でグラフを作りたいと思いました。

目的

  • 読んだ論文の管理
  • 以下を可視化
    • 論文同士の関係性
    • 著者同士の関係性
    • 著者と論文の関係性

試行錯誤

・Google SpreadsheetでDB作成→Glideなどで可視化(データの特性上表DBは厳しい)
・Miroなどでマインドマップ作成(複雑な関係を描けない)

現状あるサービスをそのまま使うのは難しそうです。

まず結論

無いなら作ったらいいんじゃない?

ということで、Neo4jというグラフDBを使ってみることにしました。

環境整備(インストール) on Mac

Neo4jのCommunity版(無料)をインストールします。

Java 11 のSDK入れて、Neo4jのインストールパッケージからバイナリ動かして、とかやり方色々あるみたいなのですがMacユーザーならbrewで入れるのが一番楽だと思います。ターミナルで以下を入力。

brew install neo4j

これでインストールは完了。

とりあえずの間は何ができるのかを見るためにいろいろいじっていこうと思います。コンソールモードでNeo4jを開くためにターミナルで以下を入力。

neo4j console

ログに2020-10-30 09:34:59.251+0000 INFO  Remote interface available at http://localhost:7474/ と出てきました。これをブラウザで開きます。ターミナルで以下を入力、もしくはブラウザのURLに直入力。

open http://localhost:7474/

ログインを求められるので以下を入力。

ID: neo4j
Password: neo4j

そのあと、新しいパスワードを設定できます。Generateというボタンでパスワードを生成してくれますが、ここでパスワードのメモをとって置かないと後でもう一度パスワードを設定し直す必要があります。僕はGoogle Chromeのパスワード管理用の拡張機能に頼りすぎて、この時点でメモを取らなかった結果Stackoverflowに行く羽目になりました。

Neo4jを使ってみた

早速データベースをいじってみます。create database paperGraphでデータベースを作って、と思ったら権限エラー。

https://neo4j.com/developer/manage-multiple-databases/

このサイトをみて、neo4jではなくsystemという名前のデータベースからなら作れるかなと思って再トライするもダメ。調べてみるとエンタープライズ用(有料)の機能だそうです。とりあえずは今あるデータベースで我慢。

グラフ作成①ノード追加

読んでいる論文をグラフDBに入力していきます。今回使った論文はこれ。

https://dl.acm.org/doi/10.1145/3054132

まずは著者の登録。以下で著者をノードとして登録。

CREATE (:Author{name:"Joachim Gudmundsson"});

次に研究機関の登録。

CREATE (:Institute{name:"The University of Sydney"});

必要に応じて国名などを入れてもいいかもしれません。

最後に著者ノードと研究機関ノードをつなげます。

Match (a:Author{name:"Joachim Gudmundsson"}), (b:Institute{name:"The University of Sydney"}) 
Merge(a)-[:belongs_to{faculty:"School of Information Technologies"}]->(b);

こんなグラフができました。Facultyは研究機関ノードのプロパティにしてもいいのですが、そうするとノードが増えすぎるかなと思ってひとまずはリレーションのプロパティにしてます(リレーションもノードと同じくプロパティを持つことができます)。他にいい案があったらコメント欄で教えて下さい!

なお、ノードとリレーションは同時に作ることもできます。

create (:Author{name:"Michael Horton"})-[:belongs_to{faculty:"Data61"}]->(:Institute{name:"CSIRO"});
著者と研究機関ノードがそれぞれ2つずつ。著者ノードから研究機関ノードにリレーションがのびている。

Michael HortonさんはThe University of Sydneyにも所属しているので、そちらにもリレーションを作ります。著者の2人は大学での繋がりがあることがわかりますね。

最終的なグラフはこのようになりました。

このようにインタラクティブにグラフDBを構築できるのがNeo4jの楽しいところです。Neo4jの言語であるCypherも直感的で使いやすい。ただ、このやり方でやっていくのは限界があるのでMendeleyなどのデータをNeo4jに以降する仕組みを模索していこうと思います。