OrientDB — графовая база данных

У новичков, часто возникает вопрос, как работать с данными, ведь графовая база данных должна помогать в выборке, а новичок видит вместо данных @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);

Комментарии приветствуются и удачи в изучении.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *