中国語学習×グラフデータベース(3) - グラフデータベースでの構造を考えてみる

ノードとエッジだけ

グラフ理論の中では、ノード(頂点)とエッジ(線)の組み合わせからなっているが、Neo4jの中では、NodeとRelationshipと呼ばれている。前回の記事で使ったものを再び引っ張り出すと、青や緑の円の部分がNode、線の部分がRelationshipということになる。

f:id:deutschina:20160225174522p:plain

同じ円なのになぜ色が違うのかというと、Neo4jでは各Nodeに対してLabelを定義することができる。同じLabelを持つNodeであれば同じ色で表現される。なので青い円なら短文、緑の円なら単語という事が分かるのである。RDBMS(リレーショナルDB)の時は、テーブルにどんな項目を持たせるかを考え、データ型だったり項目長を考えたりと何かと面倒だが、グラフの場合はNodeの中の属性という位置づけなので、極端な話、持っているAttributeの種類がNodeごとに異なっていても、Labelさえ同じであれば、同じ種類の「モノ」として判断してくれる。あとから追加や変更もできるので、ざっくりと決めておけば良さそうだ。

グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門

グラフデータベース ―Neo4jによるグラフデータモデルとグラフデータベース入門

今回、ノードとして定義するもの

とりあえず、今回は以下のようなLabelを持つNodeを作ってみることにした。

  • 単語(Word) - keyword/pinyin/pinyinf/meaning
  • カテゴリ(Category) - category
  • 短文(Sentence) - sentence
  • 構文(Structure) - 未定

Labelの後ろに続けたのがAttribute。単語(Word)のところにpinyinとpinyinfという紛らわしいものがあるのだが、これは自分のネタ元のデータベースに声調番号付与した形のピンイン(例:ni3 hao3)と声調記号付きの表示用のもの(例:nǐ hǎo)の2種類を持っていたからであり、本来であれば片方だけで良い。(ちなみに、ピンインをDBに持たせる場合、検索目的においては前者の方が圧倒的に有利だと思っている。)

カテゴリ(Category)は、品詞とか成語みたいなものを入れるイメージで作ってみた。例えば動詞の用法を持つ単語に「動詞」というカテゴリを紐付けるイメージ。ただ、実際作ってみた今だからいえるが、もう少し細かい単位で作らないとあまり意味がなさそうである。動詞と紐付いている単語1000個出てきても手の施しようがない(笑)。

短文(Sentence)は、自分学習した短文をそのまま放り込むイメージ。構文(Structure)はまだ作っていないが、「虽然...不过」みたいなお決まりの構文をまとめてみようと思っている。いずれにせよ、後からAttributeを足したり引いたりは出来るので、あまり身構えずに作って後から調整しようというのが今の時点でのアイディア。

PythonとNeo4jをつなぐ - py2neo

実作業に入る前に、今回はテキストの加工などの自由度の観点から、Neo4jのクエリ言語であるCypherを直接呼び出す代わりにPythonからも操作できるように、py2neoをインストールしておく。

neo4j.com
The Py2neo 2.0 Handbook — Py2neo 2.0.8 documentation

$ pip install py2neo

これで、ゴニョゴニョする準備は整ったことになる。

(つづく)