OrientDB — графовая база данных
- Posted by swiki
- Posted on 11 февраля, 2018
- Базы данных
- No Comments.
У новичков, часто возникает вопрос, как работать с данными, ведь графовая база данных должна помогать в выборке, а новичок видит вместо данных @RID строк. Давайте разберемся в чем тут фокус.
Создаем базу данных (db-type: graph не является обязательным к указанию и идет по-умолчанию)
orientdb> create database remote:localhost/cities root 643118766B2303BEFA035E4583AFB9BBB042C11F9C0D31ED1E2CD199FBF2E0F5 local graph
Напомню, что синтаксис таков:
create database <database-url> <user> <password> <storage-type> [<db-type>]
Посмотрим информацию о нашей базе данных:
orientdb {cities}> info
и видим, что при создании появляются стандартные классы, кластеры и индексы, но нас сейчас интересует два класса V (vertex — вершины) и E (edge — ребра). Оба они пусты, проверить это можно командой:
orientdb {cities}> select from V
Добавим туда 5 городов (вершин):
create vertex set city=»Rome»
create vertex set city=»London»
create vertex set city=»Berlin»
create vertex set city=»Madrid»
create vertex set city=»Paris»
Теперь свяжем города указав дистанцию между ними (добавим ребра):
create edge from #9:0 to #9:4 set distance=1106
create edge from #9:4 to #9:0 set distance=1106
create edge from #9:4 to #9:3 set distance=1054
create edge from #9:3 to #9:4 set distance=1054
create edge from #9:3 to #9:1 set distance=1267
create edge from #9:1 to #9:3 set distance=1267
create edge from #9:1 to #9:2 set distance=930
create edge from #9:2 to #9:1 set distance=930
create edge from #9:2 to #9:0 set distance=1183
create edge from #9:0 to #9:2 set distance=1183
Таким образом мы связали города и заодно указали дистанцию между ними, это самый простой пример и его нужно понять, для этого сделаем запрос:
orientdb {cities}> select from E                               
----+------+--------+----+----
#   |@RID  |distance|out |in  
----+------+--------+----+----
0   |#10:0 |1106    |#9:0|#9:4
1   |#10:1 |1106    |#9:4|#9:0
2   |#10:2 |1054    |#9:4|#9:3
3   |#10:3 |1054    |#9:3|#9:4
4   |#10:4 |1267    |#9:3|#9:1
5   |#10:5 |1267    |#9:1|#9:3
6   |#10:6 |930     |#9:1|#9:2
7   |#10:7 |930     |#9:2|#9:1
8   |#10:8 |1183    |#9:2|#9:0
9   |#10:9 |1183    |#9:0|#9:2
----+------+--------+----+----
Далее, мы можем все в тот же класс E добавить и другие виды ребер, например укажем дружбу (friend) между Римом и Мадридом:
orientdb {cities}> create edge from #9:0 to #9:4 set friend=1
и посмотрим на результат:
orientdb {cities}> select from E                             
----+------+--------+----+----+------
#   |@RID  |distance|out |in  |friend
----+------+--------+----+----+------
0   |#10:0 |1106    |#9:0|#9:4|null  
1   |#10:1 |1106    |#9:4|#9:0|null  
2   |#10:2 |1054    |#9:4|#9:3|null  
3   |#10:3 |1054    |#9:3|#9:4|null  
4   |#10:4 |1267    |#9:3|#9:1|null  
5   |#10:5 |1267    |#9:1|#9:3|null  
6   |#10:6 |930     |#9:1|#9:2|null  
7   |#10:7 |930     |#9:2|#9:1|null  
8   |#10:8 |1183    |#9:2|#9:0|null  
9   |#10:9 |1183    |#9:0|#9:2|null  
10  |#10:10|null    |#9:0|#9:4|1     
----+------+--------+----+----+------
как видите, под дружбу у нас создался отдельный столбец и добавилась строчка связи #10:10
Все связи которые видите в виде #cluster_id:object_id это ни что иное, как объекты, т.е. с помощью следующего запроса можно посмотреть названия городов:
orientdb {cities}> select in.city from E
----+------+------
#   |@RID  |in    
----+------+------
0   |#-2:1 |Paris 
1   |#-2:2 |Rome  
2   |#-2:3 |Madrid
3   |#-2:4 |Paris 
4   |#-2:5 |London
5   |#-2:6 |Madrid
6   |#-2:7 |Berlin
7   |#-2:8 |London
8   |#-2:9 |Rome  
9   |#-2:10|Berlin
10  |#-2:11|Paris 
----+------+------
И последнее, для простоты понимания, я показал пример создания Vertex (вершины) в классе V, так вот так делать не стоит, т.к. при создании связей в классе V, автоматически создаются поля out_ и in_. А при правильном подходе, эти поля будут именованы по имени класса. Например, если Вы создадите для хранения Vertex (вершин) класс My, то поля связей будут иметь имена out_My и in_My
Для тех, кто хочет потестировать выборку, выкладываю PHP-скрипт
<?php
header('Content-Type: application/json');
error_reporting(E_ERROR | E_PARSE | E_COMPILE_ERROR);
$c = curl_init();
// имя базы данных, к которой подключаемся
$db = 'GratefulDeadConcerts';
$db = 'cities';
curl_setopt($c, CURLOPT_URL, 'http://localhost:2480/connect/'.$db);
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/4.0');// вразумительный браузер
curl_setopt($c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);//говорим что это basic
curl_setopt($c, CURLOPT_USERPWD, 'admin:admin');
$return = curl_exec($c);// посылаем запрос и получаем ответ
if( $return !== true ){
    echo 'curl_exec problems'; exit;
}
$info = curl_getinfo($c);
$sql = 'select from V';// SQL-запрос
// http://:[]/command//[/][/limit][/]
curl_setopt($c, CURLOPT_URL, 'http://localhost:2480/query/'.$db.'/sql/'.rawurlencode($sql).'/12/*:3');
curl_setopt($c, CURLOPT_POST, 0);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$json = curl_exec($c);// посылаем запрос и получаем ответ
$json_decode = json_decode($json, true);
$info2 = curl_getinfo($c);
curl_close($c);
print_r($json_decode);
Комментарии приветствуются и удачи в изучении.
