Image
Top
Navigation

チュートリアル15 : グラフデータベースで遊ぶ(centos)

チュートリアル14 : SQLを使う(centos)からの続きです。

OrientDBのもう一つの特徴であるグラフ(Graph)データベースを使ってみましょう。
グラフデータベースの特徴をまとめると以下のように表現できます。
– vertexと、それを結ぶedgeよってネットワークのように構成されます
– vertexはノード、edgeはリレーションと表現する場合もあります。
– グラフには、有向グラフと無向グラフがあります。
– 有向グラフは、edgeに向きがあるもので、例えば「フォロー」する関係を表現できます(AさんがBさんをフォローする)
– 無向グラフは、edgeに向きがないもので、例えば「友達」関係を表現できます(AさんとBさんが友達)
– 本来は、
– vertexやedgeはそれぞれプロパティを持てます

とりあえず簡単な構造のグラフデータベースを作成していろいろ試してみましょう。

グラフデータベースを作成する

コンソールからローカルデータベースにグラフデータベースを作成してみましょう。

create database remote:localhost/Graph-test1 admin パスワード plocal graph

infoコマンドでデータベースの情報を見てみましょう。


orientdb {Graph-test1}> info

Current database: Graph-test1 (url=plocal:/opt/orientdb/databases/Graph-test1)

DATABASE PROPERTIES
--------------------------------+----------------------------------------------------+
 NAME                           | VALUE                                              |
--------------------------------+----------------------------------------------------+
 Name                           | null                                               |
 Version                        | -1                                                 |
 Date format                    | yyyy-MM-dd                                         |
 Datetime format                | yyyy-MM-dd HH:mm:ss                                |
 Timezone                       | Asia/Tokyo                                         |
 Locale Country                 | JP                                                 |
 Locale Language                | ja                                                 |
 Charset                        | UTF-8                                              |
 Schema RID                     | #0:1                                               |
 Index Manager RID              | #0:2                                               |
 Dictionary RID                 | null                                               |
--------------------------------+----------------------------------------------------+

CLUSTERS
----------------------------------------------+-------+---------------------+---------+-----------------+
 NAME                                         |   ID  | TYPE                | DATASEG | RECORDS         |
----------------------------------------------+-------+---------------------+---------+-----------------+
 default                                      |     3 | PHYSICAL            |      -1 |               0 |
 e                                            |    10 | PHYSICAL            |      -1 |               0 |
 index                                        |     1 | PHYSICAL            |      -1 |               2 |
 internal                                     |     0 | PHYSICAL            |      -1 |               3 |
 manindex                                     |     2 | PHYSICAL            |      -1 |               1 |
 ofunction                                    |     7 | PHYSICAL            |      -1 |               0 |
 orids                                        |     6 | PHYSICAL            |      -1 |               0 |
 orole                                        |     4 | PHYSICAL            |      -1 |               3 |
 oschedule                                    |     8 | PHYSICAL            |      -1 |               0 |
 ouser                                        |     5 | PHYSICAL            |      -1 |               3 |
 v                                            |     9 | PHYSICAL            |      -1 |               0 |
----------------------------------------------+-------+---------------------+---------+-----------------+
 TOTAL = 11                                                                 |         |              12 |
----------------------------------------------------------------------------+---------+-----------------+

CLASSES
----------------------------------------------+------------------------------------+------------+----------------+
 NAME                                         | SUPERCLASS                         | CLUSTERS   | RECORDS        |
----------------------------------------------+------------------------------------+------------+----------------+
 E                                            |                                    | 10         |              0 |
 OFunction                                    |                                    | 7          |              0 |
 OIdentity                                    |                                    | -          |              0 |
 ORestricted                                  |                                    | -          |              0 |
 ORIDs                                        |                                    | 6          |              0 |
 ORole                                        | OIdentity                          | 4          |              3 |
 OSchedule                                    |                                    | 8          |              0 |
 OTriggered                                   |                                    | -          |              0 |
 OUser                                        | OIdentity                          | 5          |              3 |
 V                                            |                                    | 9          |              0 |
----------------------------------------------+------------------------------------+------------+----------------+
 TOTAL = 10                                                                                                    6 |
----------------------------------------------+------------------------------------+------------+----------------+

INDEXES
----------------------------------------------+------------+-----------------------+----------------+------------+
 NAME                                         | TYPE       |         CLASS         |     FIELDS     | RECORDS    |
----------------------------------------------+------------+-----------------------+----------------+------------+
 dictionary                                   | DICTIONARY |                       |                |          0 |
 ORole.name                                   | UNIQUE     | ORole                 | name           |          3 |
 OUser.name                                   | UNIQUE     | OUser                 | name           |          3 |
----------------------------------------------+------------+-----------------------+----------------+------------+
 TOTAL = 3                                                                                                     6 |
-----------------------------------------------------------------------------------------------------------------+

以前に見たドキュメントデータベースの初期クラス構成とは、違うところがありますね。

以下ががドキュメントデータベースの初期クラス構成です。


CLASSES
----------------------------------------------+------------------------------------+------------+----------------+
 NAME                                         | SUPERCLASS                         | CLUSTERS   | RECORDS        |
----------------------------------------------+------------------------------------+------------+----------------+
 OFunction                                    |                                    | 7          |              0 |
 OIdentity                                    |                                    | -          |              0 |
 ORestricted                                  |                                    | -          |              0 |
 ORIDs                                        |                                    | 6          |              0 |
 ORole                                        | OIdentity                          | 4          |              3 |
 OSchedule                                    |                                    | 8          |              0 |
 OTriggered                                   |                                    | -          |              0 |
 OUser                                        | OIdentity                          | 5          |              3 |
----------------------------------------------+------------------------------------+------------+----------------+
 TOTAL = 8                                                                                                     6 |

ドキュメントデータベースの初期クラス構成にくらべて、グラフデータベースには、
– クラスV
– クラスE
があります。

OrientDBでは、ドキュメントデータベースを基にして、より高位のデータベースとして、グラフデータベースが構築されています。
このクラスVとクラスEがグラフデータベースの中心になるわけです。

OrientDBでは、ジェネリックな永続クラスVertexを”V” (以前のバージョンではOGraphVertex)、同じくEdgeクラスを”E” (同じくOGraphEdge)と呼びます。
以下で新しくVertexを作ってみます。

詳細については以下のグラフコマンドを参照して下さい。
create vertex
delete vertex
create edge
delete edge

Vertexクラスを作る

OrientDBでは、Vクラス と Eクラスを拡張して、Vertexとedgeを作ることが出来ます。

create class Person extends V
create class Restaurant extends V

続いてデータを投入してみましょう

create vertex Person set name = '鈴木'
create vertex Person set name = '佐藤'
create vertex Person set name = '山田'
create vertex Person set name = '丸山'

create vertex Restaurant set name = 'ステーキハウス'
create vertex Restaurant set name = '天ぷら屋'
create vertex Restaurant set name = 'イタリアンレストラン'

投入結果です


orientdb {Graph-test1}> select from Person

----+-----+----
#   |@RID |name
----+-----+----
0   |#11:0|鈴木
1   |#11:1|佐藤
2   |#11:2|山田
3   |#11:3|丸山
----+-----+----

4 item(s) found. Query executed in 0.002 sec(s).
orientdb {Graph-test1}> select from Restaurant

----+-----+----------
#   |@RID |name
----+-----+----------
0   |#12:0|ステーキハウス
1   |#12:1|天ぷら屋
2   |#12:2|イタリアンレストラン
----+-----+----------

3 item(s) found. Query executed in 0.002 sec(s).

次にこれらをつなぐedgeを作ります。

edgeクラスを作る

create class Eat extends E

これはPersonとRestaurantのリレーションを表しています。edgeを作る時は、その方向が重要です。
ここでは、Person->Restaurant(PersonからRestaurantへ)の方向なので、そのPersonがあるRestaurantで食べた頃があることを表します。

では、person “鈴木” が restaurant “ステーキハウス” で食べたことがあるリレーションを作ってみましょう。

create edge Eat from (select from Person where name = '鈴木') to (select from Restaurant where name = 'ステーキハウス')

レコードIDを使えば、以下の記述方法も可能です。

create edge Eat from #11:1 to #12:0
create edge Eat from #11:2 to #12:1

まず、VertexであるRestaurantにつながっているEatを調べましょう。


select in(),out(),both() from Restaurant
    
----+-----+----+----+----    
#   |@RID |in  |out |both    
----+-----+----+----+----    
0   |#-2:1|[2] |[0] |[2]    
1   |#-2:2|[1] |[0] |[1]    
2   |#-2:3|[0] |[0] |[0]    
----+-----+----+----+----    
  • out()、そのVertexに対して前向きにつながったvertexを取得する
  • in()、そのVertexに対して後向きにつながったvertexを取得する
  • both()、そのVertexに対して双方向(どちらでも良い)につながったvertexを取得する

詳しくはSQLファンクションを参照して下さい。

これだけだとコレクションの件数しか出ていないので、今度がexpand関数を利用します。
expand()はVertexのコレクションを結果セットに変換する特別な関数です。


select expand( in() ),expand( out() ) from Restaurant    

----+-----+----+-------    
#   |@RID |name|out_Eat    
----+-----+----+-------    
0   |#11:1|佐藤  |#12:0    
1   |#11:0|鈴木  |#12:0    
2   |#11:2|山田  |#12:1    
----+-----+----+-------    

もちろん、WHERE条件も指定できます


select expand( in() ) from Restaurant where name = '天ぷら屋'    
    
    
----+-----+----+-------    
#   |@RID |name|out_Eat    
----+-----+----+-------    
0   |#11:2|山田|#12:1    
----+-----+----+-------    

次に二つのEdgeクラスを追加します。

create class Attendee extends E
create class Friend extends E

Attendeeは、Restaurant->Person、つまり、Restaurantの予約者がどのPersonであるかを表します。
Friendは、Person<->Person、つまり、Personが相互に友達であることを表します。

データを登録してみましょう。

create edge Friend from #11:0 to #11:2 

これは、鈴木さんと山田さんが友達であることを表しています。この場合向きは関係ありません。

create edge Attendee from #11:2 to #12:2 

これは、山田さんがイタリアンレストランに予約していることを表しています

さて、鈴木さんの友達が食事したころがあるレストランはどこでしょう?

鈴木さんの友達を探してみます。


select expand( both('Friend') ) from Person where name = '鈴木'   

----+-----+----+-------+---------   
#   |@RID |name|out_Eat|in_Friend   
----+-----+----+-------+---------   
0   |#11:2|山田|#12:1  |#11:0   
----+-----+----+-------+---------   

鈴木さんの友達が予約しているレストランを探してみます。


select expand( both('Friend').out('Attendee') ) from Person where name = '鈴木'   

----+-----+----------+-----------   
#   |@RID |name      |in_Attendee   
----+-----+----------+-----------   
0   |#12:2|イタリアンレストラン|#11:2   
----+-----+----------+-----------   

チュートリアル16 : JOINじゃなくてLINKを使う(centos)に続きます。