-」の一部です(どこまで続くか・・・)サンプルコードはこちらにおいた。Neo4jのユーザ定義プロシージャNeo4jにはユーザ定義のプロシージャを組み込む機能が用意されている。その利用方法はNeo4j開発初期のころよりもかなり簡単になっており、Cypherと連動した利用もできる。以下の点について紹介する。後者については、マニュアル等にあまり情報のないPathを返却するようなプロシージャの作り方についても触れる。ユーザ定義プロシージャの利用の仕方ユーザ定義プロシージャの作り方ユーザ定義プロシージャの利用の仕方インストールまずは、Neo4jから提供されているプラグインをアクティブにしてみよう。Graphのデモが開始される)。Graphを作成したデータベースを選択し、manageを選択。Desktopからインストールできるプラグインが表示される。Algorithms・GraphQLのプラグインがある。ここで右のInstallボタンを押せばプラグインはインストールされる。インストールにはインターネット接続が必要である(つながっていないとボタンは表示されない)。Folder→Pluginsによって確認できる(下はAPOCをインストールした状態)。プラグインフォルダにapoc-3.5.0.4.jarが配置されている。自分でユーザ定義プロシージャを利用するときも、自分で作ったjarをここにおいてデータベースを再起動すれば利用できる。今インストールしたAPOCをサンプルとして、Cypherからの利用方法を説明する。利用可能なプロシージャを確認してみよう。dbms.procedures()で利用できる一覧を取得することができる。プロシージャの名前、シグネチャ、概要、等が表示されている。ここではAPOCのダイクストラ探索であるapoc.algo.dijkstraやPageRankアルゴリズムであるapoc.algo.pageRank等が利用できることがわかる。プロシージャを呼び出すには、CALLを使う。dbms.procedures()もそれ自体プロシージャを呼び出す例となっている。CALLはCypherに組み込んで使うことができる。dbms.procedures()でプロシージャの名前だけが取得したいとする。利用して結果をCypherの変数にマッピングし、RETURN句で絞り込めばよい。この例では、dbms.procedures()の結果のnameをhogeというCypherの変数にマッピングして、hogeをRETURNしている。次に、apoc.algo.allSimplePathsを使ってノード間のパスを取得してみよう。下記のサンプルような書き方をすることができる。Reloadedというタイトルをもったノードへ、ACTED_INというタイプをもった関連によって到達するパスを求めるようなクエリとなる。このようにプロシージャはCypherに統合された形で利用することができる。path上記サンプルの実行結果が以下の通りである。Templateが提供されている。このテンプレートを拡張する形でプロシージャを作成するのが楽である。このプロジェクトにはFullTextIndex.java、Join.java、Last.javaの3つのテンプレートが含まれているが、後の2つはユーザ定義関数(Last.javaはさらに集計)の例なので、ここではプロシージャの例であるFullTextIndex.javaを参考にすることにする。2つの文字列を連結するようなプロシージャを作ってみる。以下のコードを挿入すれば機能する。@Procedureアノテーションはプロシージャの名前、@Descriptionアノテーションはプロシージャの説明を表しており、dbms.procedures()の結果に表示される。プロシージャの引数は@Nameアノテーションを使う。結果はユーザが任意の作成した結果用クラスのオブジェクトのStreamとする必要がある。結果用クラスのクラス名は任意である。クラスのメンバーには、プロシージャの結果として使われる変数の名前と型を定義する必要がある。この修正を行った後、リビルドし作成したjarをプラグインフォルダに置き、再起動すればこのプロシージャが利用可能となる。dbms.procedures()によって、正しく組み込めたかどうかが確認できる。確かに、example.sample01が組み込まれている。良い例ではないが、Personのnameを2つつなげてみた。自分の探索アルゴリズムを実装し利用するためには、Pathを返却するプロシージャを作る必要がある。Pathを返却する例はこのテンプレートにはなく、また、Pathを作ることはCypherを通じてNeo4jを利用する限り、ほとんど必要にならないために開発者マニュアルにも記述がない。Finding系のソースコードを見ればよい。Pathの作成にはorg.neo4j.graphalgo.impl.util.PathImpl.Builderを使用する。Browserでノードを選んだときに<id>と表示される番号である。内部的なidなので積極的に使うことは推奨されない)。}ここにでてくるdbとはFullTextIndex.javaに以下のように定義されている。db;GraphDatbaseServiceとは、いわゆるデータベースプロセスに対応するオブジェクトのクラスであり、データベースにアクセスする場合はこのオブジェクトから情報にアクセスしていく。getNodeById()は、そのデータベースのidからNodeを取得するAPIである。そこで指定されたノードに対してgetRelationships()で隣接するRelationship(関連)を取得している。Pathの作り方は簡単で、builderに対して、Relationshipをpush()していって、完成したらbuild()すればよい。Reeves(さすがにNeo4j!:KeanuはMatrixのNeo役)でその隣接するパスが求められている。最低限、これだけの内容がわかれば、自分で探索アルゴリズムを作成して拡張していくことが可能だろう。upLoginユーザーは見つかりませんでした。