Проект

Общее

Профиль

Stage-2 » История » Версия 27

Александр Александров, 06.11.2019 00:57

1 1 Александр Александров
h1. План работы
2
3 3 Александр Александров
Работа над тестовым заданием:
4 2 Александр Александров
5 3 Александр Александров
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должно быть отражено успех программы или неуспех. Это наглядно покажет как должна работать программа.
6
* Схематично отразить работу программы, рассмотреть несколько вариантов работы, где должны быть отражены успешные и не успешные запросы к сервису. Это наглядно покажет как должна работать программа.
7 1 Александр Александров
* Создание основной бизнес логики.
8 18 Александр Александров
* Создать структуру веб-приложения работающего как REST-сервис.
9 3 Александр Александров
* Покрытие тестами.
10 4 Александр Александров
11
----
12
13
h1. Структура данных.
14
15
h2. Входные данные
16
17
h3. Граф
18
19 11 Александр Александров
Входными данными будет граф G(V,E), где V - множество вершин графа (ноды), E - множество рёбер, соединяющих вершины. Граф не ориентированный. Сама вершина (нода) представляет собой объект, состоящий из уникального имени. Ребро представляет собой объект состоящий из двух ссылок на вершины, которые это ребро соединяет, в данном случае под ссылками подразумевается уникальное имя ноды. В формате JSON это будет выглядеть так:   
20 4 Александр Александров
21
<pre>
22 20 Александр Александров
{"nodes": [{"name":"unique_node_name"}, ...], "edges": [{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, ...]}
23 4 Александр Александров
</pre>
24
25
, где
26
27 10 Александр Александров
_{"name":”unique_node_name"}_ - объект описывающий вершину графа (ноду)
28
_{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}_ - объект описывающий ребро, соединяющее две вершины графа.
29 4 Александр Александров
30 19 Александр Александров
*Графическое представление входных графов*
31 4 Александр Александров
32
{{dmsf_image(134)}}
33
34
Циклический граф
35
36
{{dmsf_image(131)}}
37
38
Ациклический граф
39
40
Входные графы могут содержать циклы, которые нужно исключить по условию задачи.
41 1 Александр Александров
42 19 Александр Александров
*В качестве дополнения (это не входило в основную задачу)*
43
44
Возможность работы с нодами отдельно, т.е. в граф можно добавить ноду или набор нод отдельным запросом
45
46
Входной одиночный объект, описывающий ноду
47
48
<pre>
49
{"name":"unique_node_name"}
50
</pre>
51
52
Входной набор нод
53
54
<pre>
55
[{"name":"unique_node_name"}, {"name":"unique_node_name"}, ...]
56
</pre>
57
58 20 Александр Александров
Возможность работы с рёбрами графа отдельно, т.е. в граф можно добавить ребро или набор рёбер отдельным запросом
59 19 Александр Александров
60
Входной, одиночный объект описывающий ребро графа
61
62
<pre>
63
{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}
64
</pre>
65
66 20 Александр Александров
Входной набор рёбер
67 19 Александр Александров
68
<pre>
69
[{"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, {"nodeOne":"unique_node_one_name", "nodeTwo":"unique_node_one_name"}, ...]
70
</pre>
71
72 4 Александр Александров
h3. Вершины графа (Ноды)
73 12 Александр Александров
74 4 Александр Александров
Так же на вход будут подаваться списки вершин графа для проверки связности вершин. Представляет собой простой перечень уникальных имён вершин.
75
В представлении JSON будет выглядеть так:
76
77 12 Александр Александров
<pre>
78 4 Александр Александров
["unique_node_name", "unique_node_name", ...]
79
</pre>
80 12 Александр Александров
81 4 Александр Александров
, где unique_node_name - уникальное имя вершины.
82
83 1 Александр Александров
h2. Структура выходных данных
84
85 19 Александр Александров
При запросе к сервису можно получить следующие данные:
86
87
*Граф целиком*
88
89
<pre>
90
{"nodes":[{"id":1, "name":"unique_name", "counter":0}, ...], "edges":[{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...]}
91
</pre>
92
93
94
*Список вершин графа*
95 4 Александр Александров
96
<pre>
97 13 Александр Александров
[{"id":1, "name":"unique_name", "counter":0}, ...]
98 4 Александр Александров
</pre>
99 1 Александр Александров
100 13 Александр Александров
или объект отдельной вершины (информацию по отдельной вершине можно получить выполнив соответствующий запрос, либо по уникальному имени или по идентификатору вершины)
101
102
<pre>
103
{"id":1, "name":"unique_name", "counter":0}
104
</pre>
105
106
,где: id - уникальный идентификатор вершины, name - уникальное имя вершины, counter - счётчик посещения вершины.
107 4 Александр Александров
108 14 Александр Александров
Так же есть возможность получить информацию по рёбрам графа в следующем формате
109
110
Списком
111
112
<pre>
113
[{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}, ...]
114
</pre>
115
116
Отдельным объектом
117
118 21 Александр Александров
<pre>
119 14 Александр Александров
{"id":1, "nodeOne":"unique_node_name_one", "nodeOne":"unique_node_name_one"}
120 21 Александр Александров
</pre>
121 14 Александр Александров
122
,где: id - уникальный идентификатор ребра графа, nodeOne, nodeTwo - уникальное имя узла графа. Запись ребра графа хранит информацию о одной паре узлов.
123
124 4 Александр Александров
h2. Модель хранения данных
125
126
Класс *Node* - описывающий модель вершины графа (ноды). Класс состоит из следующих полей:
127 15 Александр Александров
128
*id* - уникальный идентификатор (нужен для хранения в БД). Присваивается автоматически при  записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы.
129 4 Александр Александров
*name* - уникальное имя узла (получаем из json).
130 15 Александр Александров
*counter* - при каждом удачном проходе маршрута через ноду, счётчик ноды увеличивается автоматически, данный параметр только на отдачу из базы, его нельзя заменить из вне.
131 1 Александр Александров
132 4 Александр Александров
133 15 Александр Александров
Класс *Edge* - описывающий модель ребра графа. Ребро графа способно хранить информацию только о одной паре паре узлов. Класс состоит из следующих полей:
134
135
*id* - уникальный идентификатор записи (нужен для хранения в БД). Присваивается автоматически при  записи в БД, его нельзя изменить из вне, данный параметр только на отдачу из базы.
136
*nodeOne* - ссылка на первую ноду
137
*nodeTwo* - ссылка на вторую ноду
138 4 Александр Александров
139
h2. Модель хранения данных в БД
140
141
{{dmsf_image(135)}}
142
143 16 Александр Александров
Связь один-к-одному Одна запись ребра графа хранит две ссылки на разные ноды
144 5 Александр Александров
145 17 Александр Александров
SQL Schema (PostgreSQL notation)
146 4 Александр Александров
147 1 Александр Александров
<pre><code class="sql">
148 16 Александр Александров
DROP TABLE IF EXISTS nodes CASCADE;
149
DROP TABLE IF EXISTS edges;
150
DROP SEQUENCE IF EXISTS global_seq CASCADE;
151
152
CREATE SEQUENCE global_seq START 5000;
153
154
CREATE TABLE nodes (
155
    id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'),
156
    name VARCHAR NOT NULL,
157
    counter INTEGER DEFAULT 0 NOT NULL
158 4 Александр Александров
);
159 16 Александр Александров
CREATE UNIQUE INDEX nodes_unique_name_idx ON nodes(name);
160 4 Александр Александров
161 16 Александр Александров
CREATE TABLE edges (
162
    id INTEGER PRIMARY KEY DEFAULT nextval('global_seq'),
163
    nodeone INT NOT NULL,
164
    nodetwo INT NOT NULL,
165
    FOREIGN KEY (nodeone) REFERENCES nodes(id) ON DELETE CASCADE,
166
    FOREIGN KEY (nodetwo) REFERENCES nodes(id) ON DELETE CASCADE,
167
    CHECK (nodeone <> nodetwo),
168
    CONSTRAINT unique_edge UNIQUE (nodeone, nodetwo)
169 1 Александр Александров
);
170
</code></pre>
171 22 Александр Александров
172
h2. Виды ошибок
173
174
При различных запросах к программе могут возникать различного вида ошибки. В программе ошибки перехватываются специальным обработчиком, который на выход формирует специальный объект. В данном объекте описывается вид ошибки, место её возникновения и текст сообщения ошибки.
175
176
Модель данных ошибки:
177
178
{{dmsf_image(407)}}
179
180
Выходные данные о возникшей ошибки в формате JSON
181
182
<pre>
183
{
184
  "url": "request_link",
185
  "type": "APP_ERROR[,DATA_NOT_FOUND,DATA_ERROR,VALIDATION_ERROR]",
186
  "place": "APP[,GRAPH,NODE,EDGE]",
187
  "messages": [
188
    "Any message 1",
189
    "Any message 2",
190
    ...
191
  ]
192
}
193
</pre>
194
195
Виды сообщения об ошибках:
196
197
*Обобщенные сообщения об ошибках*
198
199
* Argument must not be null - на вход вместо объекта был подан null
200
* Collection must not be empty - на вход поступила пустая коллекция данных
201
* Collection must not contain a null item - на вход поступила коллекция, в которой содержится null элемент
202
* Collection must have more than one element - в определённых случаях требуется что бы коллекция состояла как минимум из двух элементов (например при работе с рёбрами графа, где требуется указать две вершины графа, которые нужно связать)
203
* %s with ID = %d is not found - данные с указанным ID не обнаружены, где %s - может быть или NODE или EDGE, %d - номер id'шника.
204
205
*Сообщения об ошибках, возникающие при работе с рёбрами графа*
206
207
* Edge for nodes [%s, %s] is not found - ребро для указанных вершин (нод) не найдено, [%s, %s] - уникальные имена пары вершин.
208
* Edge for nodes ([%s, %s], [%s, %s]) already present in the graph - данное сообщение возникает при попытки добавить в граф уже существующее ребро. Где ([%s, %s], [%s, %s]) - подставляются уникальные имена вершин графа. Так как граф неориентированный, то например v1 и v2 <=> v2 и v1.
209
* Edges for node %s is not found - данное сообщение возникает при попытки извлечь информацию по рёбрам графа для заданной вершины, %s - уникальное имя вершины графа.
210
211
*Сообщения об ошибках, возникающие при работе с вершинами (нодами) графа*
212
213
* Node %s already present in the graph - данное сообщение возникает, при попытки добавить вершину, которая уже присутствует в графе.
214
* Error while update node with id = - сообщение возникает при неудачной попытки обновить данные по вершине графа, где id - номер идентификатора вершины.
215
* Node with NAME = %s is not found - сообщение возникает, при неудачном поиске вершины графа по её уникальному имени.
216
* Node %s is not found - сообщение возникает, при неудачном поиске вершины графа в режиме поиска по заданному объекту.
217
* Nodes %s and %s are not reachable to each other - сообщение возникает если один из узлов (вершин графа) не достижим до другого узла (т.е. имеются промежуточные узлы).
218
* Node %s is fault - сообщение возникает в случае генерации сбоя в узле (в вершине графа), т.е. узел оказался недоступным во время обхода по узлам.
219 23 Александр Александров
220
h2. REST-запросы
221
222
В программе доступны следующие виды HTTP запросов: *GET, POST, DELETE и OPTION*
223
Могут возвращаться следующие коды статуса: *200, 201, 204, 422, 500*
224
225 27 Александр Александров
Ниже представлены примеры HTTP запросов
226
227 26 Александр Александров
h3. HTTP запросы при работе с графом
228 23 Александр Александров
229
*GET http://localhost:8080/rest/v1/graph* - возвращает объект графа
230
231
*Данные возвращаемые при запросе*
232
233
<pre><code class="javascript">
234
{
235
  "nodes": [
236
    {
237
      "name": "v1",
238
      "counter": 0,
239
      "id": 5000
240
    },
241
    {
242
      "name": "v2",
243
      "counter": 0,
244
      "id": 5001
245
    },
246
    {
247
      "name": "v3",
248
      "counter": 0,
249
      "id": 5002
250
    },
251
    {
252
      "name": "v4",
253
      "counter": 0,
254
      "id": 5003
255
    },
256
    {
257
      "name": "v5",
258
      "counter": 0,
259
      "id": 5004
260
    }
261
  ],
262
  "edges": [
263
    {
264
      "nodeOne": "v1",
265
      "nodeTwo": "v3",
266
      "id": 5006
267
    },
268
    {
269
      "nodeOne": "v1",
270
      "nodeTwo": "v2",
271
      "id": 5005
272
    },
273
    {
274
      "nodeOne": "v1",
275
      "nodeTwo": "v5",
276
      "id": 5007
277
    },
278
    {
279
      "nodeOne": "v3",
280
      "nodeTwo": "v4",
281
      "id": 5008
282
    }
283
  ]
284
}
285
</code></pre>
286
287
----
288
289
GET http://localhost:8080/rest/v1/graph/export - возвращает граф в формате GraphViz
290
291
*Данные возвращаемые при запросе*
292
293
<pre>
294
strict graph G {
295
v1_5000 [ label="v1" ];
296
v2_5001 [ label="v2" ];
297
v3_5002 [ label="v3" ];
298
v4_5003 [ label="v4" ];
299
v5_5004 [ label="v5" ];
300
v3_5002 -- v4_5003;
301
v1_5000 -- v2_5001;
302
v1_5000 -- v3_5002;
303
v1_5000 -- v5_5004;
304
}
305
</pre>
306
307
----
308
309
*DELETE http://localhost:8080/rest/v1/graph* - удаляет граф с БД, т.е. полностью удаляется информация с БД по узлам и рёбрам графа.
310
311
----
312
313
POST http://localhost:8080/rest/v1/graph - создаёт новый граф, при этом прежний граф полностью удаляется.
314
315
*Тело запроса*
316
317
<pre><code class="javascript">
318
{
319
    "nodes":[
320
      {"name":"v1"},
321
      {"name":"v2"},
322
      {"name":"v3"},
323
      {"name":"v4"},
324
      {"name":"v5"}
325
    ],
326
    "edges":[
327
      {"nodeOne":"v1","nodeTwo":"v2"},
328
      {"nodeOne":"v2","nodeTwo":"v3"},
329
      {"nodeOne":"v3","nodeTwo":"v4"},
330
      {"nodeOne":"v3","nodeTwo":"v5"},
331
      {"nodeOne":"v5","nodeTwo":"v4"},
332
      {"nodeOne":"v5","nodeTwo":"v2"}
333
    ]
334
}
335
</code></pre>
336
337
*Данные возвращаемые при запросе*
338
339
<pre><code class="javascript">
340
{
341
  "nodes": [
342
    {
343
      "name": "v1",
344
      "counter": 0,
345
      "id": 5013
346
    },
347
    {
348
      "name": "v3",
349
      "counter": 0,
350
      "id": 5009
351
    },
352
    {
353
      "name": "v5",
354
      "counter": 0,
355
      "id": 5011
356
    },
357
    {
358
      "name": "v2",
359
      "counter": 0,
360
      "id": 5010
361
    },
362
    {
363
      "name": "v4",
364
      "counter": 0,
365
      "id": 5012
366
    }
367
  ],
368
  "edges": [
369
    {
370
      "nodeOne": "v3",
371
      "nodeTwo": "v4",
372
      "id": 5015
373
    },
374
    {
375
      "nodeOne": "v1",
376
      "nodeTwo": "v2",
377
      "id": 5014
378
    },
379
    {
380
      "nodeOne": "v5",
381
      "nodeTwo": "v4",
382
      "id": 5016
383
    },
384
    {
385
      "nodeOne": "v5",
386
      "nodeTwo": "v2",
387
      "id": 5017
388
    }
389
  ]
390
}
391
</code></pre>
392
393
----
394
395
*POST http://localhost:8080/rest/v1/graph/checkroute* - проверка работоспособности заданной последовательности узлов.
396
397
*Тело запроса*
398
399
<pre>
400
["v1", "v2", "v3"]
401
</pre>
402
403
*Данные возвращаемые при запросе*
404
405
<pre>
406
Route for nodes [v1, v2, v3] is found
407
</pre>
408
409
h3. HTTP запросы при отдельной работе с узлами графа
410
411
POST http://localhost:8080/rest/v1/graph/nodes - добавляет объект узла в граф
412
413
*Тело запроса*
414
415
<pre>
416
{"name":"v9"}
417
</pre>
418
419
*Данные возвращаемые при запросе*
420
421
<pre><code class="javascript">
422
{
423
  "name": "v9",
424
  "counter": 0,
425
  "id": 5009
426
}
427
</code></pre>
428
429
----
430
431
POST http://localhost:8080/rest/v1/graph/nodes/byBatch - добавление набора узлов в граф
432
433
*Тело запроса*
434
435
<pre>
436
[{"name":"6"}, {"name":"v7"}, {"name":"v8"}]
437
</pre>
438
439
*Данные возвращаемые при запросе*
440
441
<pre><code class="javascript">
442
[
443
  {
444
    "name": "6",
445
    "counter": 0,
446
    "id": 5010
447
  },
448
  {
449
    "name": "v7",
450
    "counter": 0,
451
    "id": 5011
452
  },
453
  {
454
    "name": "v8",
455
    "counter": 0,
456
    "id": 5012
457
  }
458
]
459
</code></pre>
460
461
----
462
463
GET http://localhost:8080/rest/v1/graph/nodes - выводит список всех узлов в графе
464
465
*Данные возвращаемые при запросе*
466
467
<pre><code class="javascript">
468
[
469
  {
470
    "name": "6",
471
    "counter": 0,
472
    "id": 5010
473
  },
474
  {
475
    "name": "v1",
476
    "counter": 1,
477
    "id": 5000
478
  },
479
  {
480
    "name": "v2",
481
    "counter": 1,
482
    "id": 5001
483
  },
484
  {
485
    "name": "v3",
486
    "counter": 1,
487
    "id": 5002
488
  },
489
  {
490
    "name": "v9",
491
    "counter": 0,
492
    "id": 5009
493
  },
494
  {
495
    "name": "v4",
496
    "counter": 0,
497
    "id": 5003
498
  },
499
  {
500
    "name": "v5",
501
    "counter": 0,
502
    "id": 5004
503
  },
504
  {
505
    "name": "v7",
506
    "counter": 0,
507
    "id": 5011
508
  },
509
  {
510
    "name": "v8",
511
    "counter": 0,
512
    "id": 5012
513
  }
514
]
515
</code></pre>
516
517
----
518
519
GET http://localhost:8080/rest/v1/graph/nodes/byId/5000 - выводит объект узла по заданному ID
520
521
*Данные возвращаемые при запросе*
522
523
<pre><code class="javascript">
524
{
525
  "name": "v1",
526
  "counter": 1,
527
  "id": 5000
528
}
529
</code></pre>
530
531
----
532
533
GET http://localhost:8080/rest/v1/graph/nodes/byName/v1 - выводит объект узла по заданному имени
534
535
*Данные возвращаемые при запросе*
536
537
<pre><code class="javascript">
538
{
539
  "name": "v1",
540
  "counter": 1,
541
  "id": 5000
542
}
543
</code></pre>
544
545
----
546
547
*DELETE http://localhost:8080/rest/v1/graph/nodes* - удаляет все узлы и рёбра связанные с узлами из БД
548
*DELETE http://localhost:8080/rest/v1/graph/nodes/byId/5003* - удаляет узел по заданному ID
549
*DELETE http://localhost:8080/rest/v1/graph/nodes/byName/v4* - удаляет узел по заданному имени
550
551
*DELETE http://localhost:8080/rest/v1/graph/nodes/byObj* - удаляет узел по заданному объекту
552
553
*Тело запроса*
554
555
<pre>
556
{"id": 5003, "name": "v4"}
557
</pre>
558
559
h3. HTTP запросы при отдельной работе с рёбрами графа
560
561
*POST http://localhost:8080/rest/v1/graph/edges* - добавляет объект ребра в граф
562
563
*Тело запроса*
564
565
<pre>
566
{"nodeOne": "v3", "nodeTwo": "v4"}
567
</pre>
568
569
*Данные возвращаемые при запросе*
570
571
<pre><code class="javascript">
572
{
573
  "nodeOne": "v6",
574
  "nodeTwo": "v7",
575
  "id": 5014
576
}
577
</code></pre>
578
579
----
580
581
*POST http://localhost:8080/rest/v1/graph/edges/byBatch* - добавляет список рёбер графа
582
583
*Тело запроса*
584
585
<pre>
586
[{"nodeOne": "v2", "nodeTwo": "v7"}, {"nodeOne": "v7", "nodeTwo": "v8"}, {"nodeOne": "v8", "nodeTwo": "v9"}]
587
</pre>
588
589
*Данные возвращаемые при запросе*
590
591
<pre><code class="javascript">
592
[
593
  {
594
    "nodeOne": "v2",
595
    "nodeTwo": "v7",
596
    "id": 5015
597
  },
598
  {
599
    "nodeOne": "v8",
600
    "nodeTwo": "v9",
601
    "id": 5017
602
  },
603
  {
604
    "nodeOne": "v7",
605
    "nodeTwo": "v8",
606
    "id": 5016
607
  }
608
]
609
</code></pre>
610
611
----
612
613
*GET http://localhost:8080/rest/v1/graph/edges* - возвращает список рёбер графа
614
615
*Данные возвращаемые при запросе*
616
617
<pre><code class="javascript">
618
[
619
  {
620
    "nodeOne": "v2",
621
    "nodeTwo": "v7",
622
    "id": 5015
623
  },
624
  {
625
    "nodeOne": "v8",
626
    "nodeTwo": "v9",
627
    "id": 5017
628
  },
629
  {
630
    "nodeOne": "v7",
631
    "nodeTwo": "v8",
632
    "id": 5016
633
  },
634
  {
635
    "nodeOne": "v1",
636
    "nodeTwo": "v3",
637
    "id": 5006
638
  },
639
  {
640
    "nodeOne": "v1",
641
    "nodeTwo": "v2",
642
    "id": 5005
643
  },
644
  {
645
    "nodeOne": "v1",
646
    "nodeTwo": "v5",
647
    "id": 5007
648
  },
649
  {
650
    "nodeOne": "v3",
651
    "nodeTwo": "v4",
652
    "id": 5008
653
  },
654
  {
655
    "nodeOne": "v6",
656
    "nodeTwo": "v7",
657
    "id": 5014
658
  }
659
]
660
</code></pre>
661
662
----
663
664
*GET http://localhost:8080/rest/v1/graph/edges/byId/5007* - возвращает ребро графа по заданному id
665
666
*Данные возвращаемые при запросе*
667
668
<pre><code class="javascript">
669
{
670
  "nodeOne": "v1",
671
  "nodeTwo": "v5",
672
  "id": 5007
673
}
674
</code></pre>
675
676
----
677
678
*GET http://localhost:8080/rest/v1/graph/edges/byName/v1* - возвращает список рёбер связанный с заданным узлом, при запросе задаётся уникальное имя узла
679
680
*Данные возвращаемые при запросе*
681
682
<pre><code class="javascript">
683
[
684
  {
685
    "nodeOne": "v1",
686
    "nodeTwo": "v3",
687
    "id": 5006
688
  },
689
  {
690
    "nodeOne": "v1",
691
    "nodeTwo": "v2",
692
    "id": 5005
693
  },
694
  {
695
    "nodeOne": "v1",
696
    "nodeTwo": "v5",
697
    "id": 5007
698
  }
699
]
700
</code></pre>
701
702
----
703
704
*GET http://localhost:8080/rest/v1/graph/edges/byName?nodeOne=v2&nodeTwo=v5* - выводит объект ребра по заданным узлам графа
705
706
*Данные возвращаемые при запросе*
707
708
<pre><code class="javascript">
709
{
710
  "nodeOne": "v1",
711
  "nodeTwo": "v2",
712
  "id": 5005
713
}
714
</code></pre>
715
716
----
717
718
*DELETE http://localhost:8080/rest/v1/graph/edges* - удаляет все рёбра графа
719
*DELETE http://localhost:8080/rest/v1/graph/edges/byId/5005* - удаляет ребро по заданному id
720
*DELETE http://localhost:8080/rest/v1/graph/edges/byName/v1* - удаляет список рёбер связанный с узлом, в запросе задаётся уникальное имя узла
721
*DELETE http://localhost:8080/rest/v1/graph/edges/byName?nodeOne=v3&nodeTwo=v4* - удаляет ребро по заданным узлам графа
Go to top