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