機械学習・自然言語処理の勉強メモ

学んだことのメモやまとめ

Neo4jを触ってみる

はじめに



自然言語処理を勉強していると、オントロジーシソーラスってのが出てくる。
オントロジーシソーラスを勉強すると、グラフ理論ってのが出てくる。
グラフ理論を勉強すると、グラフDBとして有名な「Neo4j」が出てくる。

ということで、今回はNeo4jの基本的なことを勉強したのでまとめようと思う。

以下の内容は公式サイトのドキュメントより引用したものが、ほとんどなので詳しく知りたい場合はそっちを見るのが良い。
neo4j.com

Property Graph Model



Neo4jは、Property Graph Modelと呼ばれている。これは、各ノードがプロパティを持ち、ノード情報を格納するモデル。
グラフ構造の基本形はこんな感じ。
f:id:kento1109:20180930115848p:plain

各構成要素を簡単に説明をする。

ノード

しばしば「エンティティ」を表現される。
1つの実体を表す構成単位みたいなもの。
f:id:kento1109:20180930120002p:plain

プロパティ付きで単一をノードを作成するには、

CREATE (n {name: {key1:value1, key2:value2, ...}})

と書く。

関係

ノード間をつなぐ要素。関係を定義してこそのグラフDB。
f:id:kento1109:20180930120525p:plain
Neo4jは有向グラフなので、ノードの向きも合わせて定義する必要がある。

ノード間の関係を定義するには、

CREATE (identifier)-[:name]->(identifier)

と書く。

プロパティ(属性)

ノードや関係などが持つ実際の値。
ノードの例だと、namebornが各プロパティ。関係の場合、rolesがプロパティ。

ラベル

グラフ構造体と呼ばれる複数のノードを1つにまとめるために使われる。オントロジーで言うところの「概念」みたいなもので、 世界(ノード)をラベルを付けて、概念化する。
ノードの図で言うと、上のノードには「Person」ラベルがついており、下のラベルには「Movie」ラベルがついていることが分かる。オントロジー上ではPersonやMovieはあくまで概念に過ぎないが、それをインスタンス化してあげると、各エンティティ(ノード)が出来あがるようなイメージ。

ノード・ラベル・プロパティの関係を図示するとこんな感じ。
f:id:kento1109:20180930121915p:plain:w160
Cypher Query Language(QL)-初級編 #neo4j - クリエーションライン株式会社
より引用)

識別子

ノードや関係性、処理結果などの値を示す構造体
上の構成要素と異なり、処理中に用いるものに過ぎないが、知っておかないとラベルとの違いに少し混乱する。
こんな感じでノードを表してみる。(emilが識別子)

emil:Person {name:'Emil'}

そうすると、emilがPerson {name:'Emil'}というノード情報を保持した構造体として記憶される。

一般的な使用方法としては、ノードと関係を作成するような例。

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)

作成されたノードに識別子の情報は一切持たないので、そのノードを使って後の文で処理しないのであれば、名前にこだわる必要は全くない。

どういうことかと言うと、

CREATE (TheMatrix:Movie {title:'The Matrix', released:1999})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})

を宣言した後で別のクエリで

CREATE (Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)

としても上の識別子のノードではなく、新しいノードが作られてしまう。

最低限こんなこととクエリの書き方さえ覚えればOKかと思う。