fbpx

Neo4j APOCで面白い機能を探してみた #neo4j

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

再びこんにちは。木内です。今回はNeo4jの拡張ライブラリAPOCで楽しんでみることにします。

Neo4j APOCとは?

APOCは "A Package Of Component" の略で、Neo4j を称する場合に便利なライブラリの集合体です。 "Awesome Procedures On Cypher" との略とも言われますし、映画マトリックスのキャラクター "APOC(エイポック)" にちなんでもいます。

Neo4j 3.0 以降、ユーザ定義関数(UDF、≒ストアドプロシージャ)を Neo4j データベースに組み込んで使用することができるようになり、このユーザ定義関数の仕組みを利用してあらかじめ作り込まれた便利な関数群をCypherクエリから簡単に利用するための関数群が APOC です。Neo4j のユーザ定義関数、APOCの紹介については弊社李のブログ記事( https://www.creationline.com/lab/19479 )も参照ください。

APOC自体は無料で利用することができます。

今回は APOC を使うと便利な機能、何に使うかよくわからない機能を紹介してみます。

APOC 便利機能(1):

日付関連機能

標準の Cypher ではISO8601に準拠した DateTime と Date をサポートしていますが、タイムスタンプなど他のフォーマットへの変換はサポートしていません。APOCはその差をうめることができます。

例えば以下の Cypher クエリは "/(スラッシュ)"区切りの日付文字列から、Neo4jのプロパティとして使用できる日付文字列を生成することができます。

neo4j: WITH apoc.date.parse("2018/12/12 13:37:44", "ms", "yyyy/MM/dd HH:mm:ss") as ts
       WITH apoc.date.format(ts) AS fmt RETURN fmt;
+-----------------------+
| fmt                   |
+-----------------------+
| "2018-12-12 13:37:44" |
+-----------------------+

数値の書式化

Neo4j に格納された Integer, Float を指定した書式に整形して出力することができます。

neo4j: RETURN apoc.number.format(12345678.9123456, '#,###.##');
+--------------------------------------------------+
| apoc.number.format(12345678.9123456, '#,###.##') |
+--------------------------------------------------+
| "12,345,678.91"                                  |
+--------------------------------------------------+

書式の指定方法は Java DecimalFormat ( https://docs.oracle.com/javase/9/docs/api/java/text/DecimalFormat.html ) に準拠しているようですが、一部の指定(通貨記号)には対応していないようです。

APOC 謎機能(1):

発音コード生成機能(Soundex)

最初見たときは「なんでこんな機能があるんだ・・・」と首をかしげていましたが、どうやら類似文字列の探索に使用したりしているようです。割とメジャーなRDBには標準搭載されているので、何かしらの用途では必須なのでしょうね。裏では Java の Soundex ( https://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/language/Soundex.html ) パッケージの機能を使用しているようです。

neo4j: CALL apoc.text.phonetic('kiuchi') YIELD value;
+--------+
| value  |
+--------+
| "K200" |
+--------+

残念ながら英語しか対応していないため、日本語を入れても正しい結果が戻りません。

neo4j: CALL apoc.text.phonetic('木内') YIELD value;
+-------+
| value |
+-------+
| ""    |
+-------+

また2つの単語の類似度を判定することもできます。0〜4の値で、0が全く似ていない、4が似ている、となります。

neo4j: CALL apoc.text.phoneticDelta('kiuchi', 'kikuchi');
+-------------------------------+
| phonetic1 | phonetic2 | delta |
+-------------------------------+
| "K200"    | "K220"    | 3     |
+-------------------------------+
neo4j> CALL apoc.text.phoneticDelta('lee', 'kiuchi');
+-------------------------------+
| phonetic1 | phonetic2 | delta |
+-------------------------------+
| "L000"    | "K200"    | 2     |
+-------------------------------+

う〜ん、合っているような、そうでもないような。

さいごに

APOC 自体には約450の機能があり、全ての機能を解説することはできませんが、折りに触れてご紹介していきたいと思います。

Neo4j APOCの機能の詳細については公式の解説ページ( https://neo4j-contrib.github.io/neo4j-apoc-procedures/ )もあわせて参照ください。

では!

新規CTA