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);
Комментарии приветствуются и удачи в изучении.
