Neo4jを触ってみる
はじめに
自然言語処理を勉強していると、オントロジーやシソーラスってのが出てくる。
オントロジーやシソーラスを勉強すると、グラフ理論ってのが出てくる。
グラフ理論を勉強すると、グラフDBとして有名な「Neo4j」が出てくる。
ということで、今回はNeo4jの基本的なことを勉強したのでまとめようと思う。
以下の内容は公式サイトのドキュメントより引用したものが、ほとんどなので詳しく知りたい場合はそっちを見るのが良い。
neo4j.com
Property Graph Model
Neo4jは、Property Graph Modelと呼ばれている。これは、各ノードがプロパティを持ち、ノード情報を格納するモデル。
グラフ構造の基本形はこんな感じ。
各構成要素を簡単に説明をする。
ノード
しばしば「エンティティ」を表現される。
1つの実体を表す構成単位みたいなもの。
プロパティ付きで単一をノードを作成するには、
CREATE (n {name: {key1:value1, key2:value2, ...}})
と書く。
関係
ノード間をつなぐ要素。関係を定義してこそのグラフDB。
Neo4jは有向グラフなので、ノードの向きも合わせて定義する必要がある。
ノード間の関係を定義するには、
CREATE (identifier)-[:name]->(identifier)
と書く。
プロパティ(属性)
ノードや関係などが持つ実際の値。
ノードの例だと、name
やborn
が各プロパティ。関係の場合、roles
がプロパティ。
ラベル
グラフ構造体と呼ばれる複数のノードを1つにまとめるために使われる。オントロジーで言うところの「概念」みたいなもので、 世界(ノード)をラベルを付けて、概念化する。
ノードの図で言うと、上のノードには「Person」ラベルがついており、下のラベルには「Movie」ラベルがついていることが分かる。オントロジー上ではPersonやMovieはあくまで概念に過ぎないが、それをインスタンス化してあげると、各エンティティ(ノード)が出来あがるようなイメージ。
ノード・ラベル・プロパティの関係を図示するとこんな感じ。
(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かと思う。