1
+ {
2
+ "nbformat" : 4 ,
3
+ "nbformat_minor" : 0 ,
4
+ "metadata" : {
5
+ "colab" : {
6
+ "name" : " ArangoDB_GOT_Tutorial.ipynb" ,
7
+ "provenance" : [],
8
+ "collapsed_sections" : []
9
+ },
10
+ "kernelspec" : {
11
+ "name" : " python3" ,
12
+ "display_name" : " Python 3"
13
+ }
14
+ },
15
+ "cells" : [
16
+ {
17
+ "cell_type" : " markdown" ,
18
+ "metadata" : {
19
+ "id" : " 7vn7qQcVHejm" ,
20
+ "colab_type" : " text"
21
+ },
22
+ "source" : [
23
+ " \n " ,
24
+ " Welcome to the ArangoDB Games OF Thrones Tutorial. \n " ,
25
+ " This is an introduction to ArangoDB’s query language AQL, built around a small dataset of characters from the novel and fantasy drama television series Game of Thrones (as of season 1). It includes character traits in two languages, some family relations, and last but not least a small set of filming locations, which makes for an interesting mix of data to work with."
26
+ ]
27
+ },
28
+ {
29
+ "cell_type" : " code" ,
30
+ "metadata" : {
31
+ "id" : " lPKaqikzz60n" ,
32
+ "colab_type" : " code" ,
33
+ "outputId" : " ab91f5f8-90f2-4557-f789-e5fdc50fb5f2" ,
34
+ "colab" : {
35
+ "base_uri" : " https://localhost:8080/" ,
36
+ "height" : 136
37
+ }
38
+ },
39
+ "source" : [
40
+ " # Install required packages\n " ,
41
+ " !pip install python-arango\n " ,
42
+ " \n " ,
43
+ " import requests\n " ,
44
+ " import json\n " ,
45
+ " from arango import ArangoClient\n "
46
+ ],
47
+ "execution_count" : 8 ,
48
+ "outputs" : [
49
+ {
50
+ "output_type" : " stream" ,
51
+ "text" : [
52
+ " Requirement already satisfied: python-arango in /usr/local/lib/python3.6/dist-packages (5.2.1)\n " ,
53
+ " Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from python-arango) (1.12.0)\n " ,
54
+ " Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from python-arango) (2.21.0)\n " ,
55
+ " Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->python-arango) (2019.11.28)\n " ,
56
+ " Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->python-arango) (3.0.4)\n " ,
57
+ " Requirement already satisfied: urllib3<1.25,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->python-arango) (1.24.3)\n " ,
58
+ " Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->python-arango) (2.8)\n "
59
+ ],
60
+ "name" : " stdout"
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ "cell_type" : " markdown" ,
66
+ "metadata" : {
67
+ "id" : " ImZHgsvrJ8pQ" ,
68
+ "colab_type" : " text"
69
+ },
70
+ "source" : [
71
+ " Before we get started we need to create a temporary database with our [managed database service Oasis](https://cloud.arangodb.com). Please note the database will be automatically deleted after 2 hours."
72
+ ]
73
+ },
74
+ {
75
+ "cell_type" : " code" ,
76
+ "metadata" : {
77
+ "id" : " un7CV5mf0M1X" ,
78
+ "colab_type" : " code" ,
79
+ "colab" : {
80
+ "base_uri" : " https://localhost:8080/" ,
81
+ "height" : 34
82
+ },
83
+ "outputId" : " f80f0b04-7424-43fe-9e1e-9ba91428d89a"
84
+ },
85
+ "source" : [
86
+ " url = 'https://a0434a558688.arangodb.cloud:8529/_db/_system/tutorialDB/tutorialDB'\n " ,
87
+ " headers = {'Content-Type': 'application/json'}\n " ,
88
+ " payload = {'username': 'testFromColab'}\n " ,
89
+ " getDB = requests.post(url, headers=headers, data=json.dumps({'':''}))\n " ,
90
+ " results = getDB.json()\n " ,
91
+ " print(results)"
92
+ ],
93
+ "execution_count" : 2 ,
94
+ "outputs" : [
95
+ {
96
+ "output_type" : " stream" ,
97
+ "text" : [
98
+ " {'dbName': 'TUT55az3kzn9mtoo69j3qtftb', 'username': 'TUTasxqh4y1dwalttxrlijphs', 'password': 'TUTvsnxtxkw0pal05thk2ex9', 'hostname': 'a0434a558688.arangodb.cloud', 'port': 8529}\n "
99
+ ],
100
+ "name" : " stdout"
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "cell_type" : " markdown" ,
106
+ "metadata" : {
107
+ "id" : " E3v4R-SHNuAU" ,
108
+ "colab_type" : " text"
109
+ },
110
+ "source" : [
111
+ " Let us connect to our temporary database:"
112
+ ]
113
+ },
114
+ {
115
+ "cell_type" : " code" ,
116
+ "metadata" : {
117
+ "id" : " 9L7fzpJW8Xcd" ,
118
+ "colab_type" : " code" ,
119
+ "outputId" : " 98bd5917-1250-468d-8667-cb6c496e3435" ,
120
+ "colab" : {
121
+ "base_uri" : " https://localhost:8080/" ,
122
+ "height" : 34
123
+ }
124
+ },
125
+ "source" : [
126
+ " \n " ,
127
+ " host = 'https://' + results['hostname'] + ':' + str(results['port'])\n " ,
128
+ " client = ArangoClient(hosts=host)\n " ,
129
+ " print(client)\n " ,
130
+ " db = client.db(results['dbName'], username=results['username'], password=results['password'])\n "
131
+ ],
132
+ "execution_count" : 9 ,
133
+ "outputs" : [
134
+ {
135
+ "output_type" : " stream" ,
136
+ "text" : [
137
+ " <ArangoClient https://a0434a558688.arangodb.cloud:8529>\n "
138
+ ],
139
+ "name" : " stdout"
140
+ }
141
+ ]
142
+ },
143
+ {
144
+ "cell_type" : " markdown" ,
145
+ "metadata" : {
146
+ "id" : " nsHRCB7eQ3Vq" ,
147
+ "colab_type" : " text"
148
+ },
149
+ "source" : [
150
+ " \n " ,
151
+ " With the above credentials we can also login into the ArangoDB UI: https://a0434a558688.arangodb.cloud:8529/:\n " ,
152
+ " \n " ,
153
+ " "
154
+ ]
155
+ },
156
+ {
157
+ "cell_type" : " code" ,
158
+ "metadata" : {
159
+ "id" : " PApkAUfp-sel" ,
160
+ "colab_type" : " code" ,
161
+ "outputId" : " c14f83bb-03ca-4862-f789-7dcf00360269" ,
162
+ "colab" : {
163
+ "base_uri" : " https://localhost:8080/" ,
164
+ "height" : 34
165
+ }
166
+ },
167
+ "source" : [
168
+ " aql = db.aql\n " ,
169
+ " \n " ,
170
+ " if db.has_collection('Characters'):\n " ,
171
+ " Characters = db.collection('Characters')\n " ,
172
+ " else:\n " ,
173
+ " Characters = db.create_collection('Characters')\n " ,
174
+ " \n " ,
175
+ " cursor = aql.execute(\n " ,
176
+ " 'INSERT {'\n " ,
177
+ " '\" name\" : \" Ned\" ,'\n " ,
178
+ " '\" surname\" : \" Stark\" ,'\n " ,
179
+ " '\" alive\" : true,'\n " ,
180
+ " '\" age\" : 41,'\n " ,
181
+ " '\" traits\" : [\" A\" ,\" H\" ,\" C\" ,\" N\" ,\" P\" ]'\n " ,
182
+ " '} INTO Characters'\n " ,
183
+ " )\n " ,
184
+ " \n " ,
185
+ " \n " ,
186
+ " print(db[\" Characters\" ])"
187
+ ],
188
+ "execution_count" : 10 ,
189
+ "outputs" : [
190
+ {
191
+ "output_type" : " stream" ,
192
+ "text" : [
193
+ " <StandardCollection Characters>\n "
194
+ ],
195
+ "name" : " stdout"
196
+ }
197
+ ]
198
+ },
199
+ {
200
+ "cell_type" : " markdown" ,
201
+ "metadata" : {
202
+ "id" : " iLwNVOp-CH9C" ,
203
+ "colab_type" : " text"
204
+ },
205
+ "source" : [
206
+ " Let’s add a bunch of other characters in a single query:\n "
207
+ ]
208
+ },
209
+ {
210
+ "cell_type" : " code" ,
211
+ "metadata" : {
212
+ "id" : " Weaf_1lMCJ7-" ,
213
+ "colab_type" : " code" ,
214
+ "colab" : {}
215
+ },
216
+ "source" : [
217
+ " cursor = aql.execute(\n " ,
218
+ " 'LET data = [\\\n " ,
219
+ " { \" name\" : \" Robert\" , \" surname\" : \" Baratheon\" , \" alive\" : false, \" traits\" : [\" A\" ,\" H\" ,\" C\" ] },\\\n " ,
220
+ " { \" name\" : \" Jaime\" , \" surname\" : \" Lannister\" , \" alive\" : true, \" age\" : 36, \" traits\" : [\" A\" ,\" F\" ,\" B\" ] },\\\n " ,
221
+ " { \" name\" : \" Catelyn\" , \" surname\" : \" Stark\" , \" alive\" : false, \" age\" : 40, \" traits\" : [\" D\" ,\" H\" ,\" C\" ] },\\\n " ,
222
+ " { \" name\" : \" Cersei\" , \" surname\" : \" Lannister\" , \" alive\" : true, \" age\" : 36, \" traits\" : [\" H\" ,\" E\" ,\" F\" ] },\\\n " ,
223
+ " { \" name\" : \" Daenerys\" , \" surname\" : \" Targaryen\" , \" alive\" : true, \" age\" : 16, \" traits\" : [\" D\" ,\" H\" ,\" C\" ] },\\\n " ,
224
+ " { \" name\" : \" Jorah\" , \" surname\" : \" Mormont\" , \" alive\" : false, \" traits\" : [\" A\" ,\" B\" ,\" C\" ,\" F\" ] },\\\n " ,
225
+ " { \" name\" : \" Petyr\" , \" surname\" : \" Baelish\" , \" alive\" : false, \" traits\" : [\" E\" ,\" G\" ,\" F\" ] },\\\n " ,
226
+ " { \" name\" : \" Viserys\" , \" surname\" : \" Targaryen\" , \" alive\" : false, \" traits\" : [\" O\" ,\" L\" ,\" N\" ] },\\\n " ,
227
+ " { \" name\" : \" Jon\" , \" surname\" : \" Snow\" , \" alive\" : true, \" age\" : 16, \" traits\" : [\" A\" ,\" B\" ,\" C\" ,\" F\" ] },\\\n " ,
228
+ " { \" name\" : \" Sansa\" , \" surname\" : \" Stark\" , \" alive\" : true, \" age\" : 13, \" traits\" : [\" D\" ,\" I\" ,\" J\" ] },\\\n " ,
229
+ " { \" name\" : \" Arya\" , \" surname\" : \" Stark\" , \" alive\" : true, \" age\" : 11, \" traits\" : [\" C\" ,\" K\" ,\" L\" ] },\\\n " ,
230
+ " { \" name\" : \" Robb\" , \" surname\" : \" Stark\" , \" alive\" : false, \" traits\" : [\" A\" ,\" B\" ,\" C\" ,\" K\" ] },\\\n " ,
231
+ " { \" name\" : \" Theon\" , \" surname\" : \" Greyjoy\" , \" alive\" : true, \" age\" : 16, \" traits\" : [\" E\" ,\" R\" ,\" K\" ] },\\\n " ,
232
+ " { \" name\" : \" Bran\" , \" surname\" : \" Stark\" , \" alive\" : true, \" age\" : 10, \" traits\" : [\" L\" ,\" J\" ] },\\\n " ,
233
+ " { \" name\" : \" Joffrey\" , \" surname\" : \" Baratheon\" , \" alive\" : false, \" age\" : 19, \" traits\" : [\" I\" ,\" L\" ,\" O\" ] },\\\n " ,
234
+ " { \" name\" : \" Sandor\" , \" surname\" : \" Clegane\" , \" alive\" : true, \" traits\" : [\" A\" ,\" P\" ,\" K\" ,\" F\" ] },\\\n " ,
235
+ " { \" name\" : \" Tyrion\" , \" surname\" : \" Lannister\" , \" alive\" : true, \" age\" : 32, \" traits\" : [\" F\" ,\" K\" ,\" M\" ,\" N\" ] },\\\n " ,
236
+ " { \" name\" : \" Khal\" , \" surname\" : \" Drogo\" , \" alive\" : false, \" traits\" : [\" A\" ,\" C\" ,\" O\" ,\" P\" ] },\\\n " ,
237
+ " { \" name\" : \" Tywin\" , \" surname\" : \" Lannister\" , \" alive\" : false, \" traits\" : [\" O\" ,\" M\" ,\" H\" ,\" F\" ] },\\\n " ,
238
+ " { \" name\" : \" Davos\" , \" surname\" : \" Seaworth\" , \" alive\" : true, \" age\" : 49, \" traits\" : [\" C\" ,\" K\" ,\" P\" ,\" F\" ] },\\\n " ,
239
+ " { \" name\" : \" Samwell\" , \" surname\" : \" Tarly\" , \" alive\" : true, \" age\" : 17, \" traits\" : [\" C\" ,\" L\" ,\" I\" ] },\\\n " ,
240
+ " { \" name\" : \" Stannis\" , \" surname\" : \" Baratheon\" , \" alive\" : false, \" traits\" : [\" H\" ,\" O\" ,\" P\" ,\" M\" ] },\\\n " ,
241
+ " { \" name\" : \" Melisandre\" , \" alive\" : true, \" traits\" : [\" G\" ,\" E\" ,\" H\" ] },\\\n " ,
242
+ " { \" name\" : \" Margaery\" , \" surname\" : \" Tyrell\" , \" alive\" : false, \" traits\" : [\" M\" ,\" D\" ,\" B\" ] },\\\n " ,
243
+ " { \" name\" : \" Jeor\" , \" surname\" : \" Mormont\" , \" alive\" : false, \" traits\" : [\" C\" ,\" H\" ,\" M\" ,\" P\" ] },\\\n " ,
244
+ " { \" name\" : \" Bronn\" , \" alive\" : true, \" traits\" : [\" K\" ,\" E\" ,\" C\" ] },\\\n " ,
245
+ " { \" name\" : \" Varys\" , \" alive\" : true, \" traits\" : [\" M\" ,\" F\" ,\" N\" ,\" E\" ] },\\\n " ,
246
+ " { \" name\" : \" Shae\" , \" alive\" : false, \" traits\" : [\" M\" ,\" D\" ,\" G\" ] },\\\n " ,
247
+ " { \" name\" : \" Talisa\" , \" surname\" : \" Maegyr\" , \" alive\" : false, \" traits\" : [\" D\" ,\" C\" ,\" B\" ] },\\\n " ,
248
+ " { \" name\" : \" Gendry\" , \" alive\" : false, \" traits\" : [\" K\" ,\" C\" ,\" A\" ] },\\\n " ,
249
+ " { \" name\" : \" Ygritte\" , \" alive\" : false, \" traits\" : [\" A\" ,\" P\" ,\" K\" ] },\\\n " ,
250
+ " { \" name\" : \" Tormund\" , \" surname\" : \" Giantsbane\" , \" alive\" : true, \" traits\" : [\" C\" ,\" P\" ,\" A\" ,\" I\" ] },\\\n " ,
251
+ " { \" name\" : \" Gilly\" , \" alive\" : true, \" traits\" : [\" L\" ,\" J\" ] },\\\n " ,
252
+ " { \" name\" : \" Brienne\" , \" surname\" : \" Tarth\" , \" alive\" : true, \" age\" : 32, \" traits\" : [\" P\" ,\" C\" ,\" A\" ,\" K\" ] },\\\n " ,
253
+ " { \" name\" : \" Ramsay\" , \" surname\" : \" Bolton\" , \" alive\" : true, \" traits\" : [\" E\" ,\" O\" ,\" G\" ,\" A\" ] },\\\n " ,
254
+ " { \" name\" : \" Ellaria\" , \" surname\" : \" Sand\" , \" alive\" : true, \" traits\" : [\" P\" ,\" O\" ,\" A\" ,\" E\" ] },\\\n " ,
255
+ " { \" name\" : \" Daario\" , \" surname\" : \" Naharis\" , \" alive\" : true, \" traits\" : [\" K\" ,\" P\" ,\" A\" ] },\\\n " ,
256
+ " { \" name\" : \" Missandei\" , \" alive\" : true, \" traits\" : [\" D\" ,\" L\" ,\" C\" ,\" M\" ] },\\\n " ,
257
+ " { \" name\" : \" Tommen\" , \" surname\" : \" Baratheon\" , \" alive\" : true, \" traits\" : [\" I\" ,\" L\" ,\" B\" ] },\\\n " ,
258
+ " { \" name\" : \" Jaqen\" , \" surname\" : \" Hghar\" , \" alive\" : true, \" traits\" : [\" H\" ,\" F\" ,\" K\" ] },\\\n " ,
259
+ " { \" name\" : \" Roose\" , \" surname\" : \" Bolton\" , \" alive\" : true, \" traits\" : [\" H\" ,\" E\" ,\" F\" ,\" A\" ] },\\\n " ,
260
+ " { \" name\" : \" The High Sparrow\" , \" alive\" : true, \" traits\" : [\" H\" ,\" M\" ,\" F\" ,\" O\" ] }\\\n " ,
261
+ " ]\\\n " ,
262
+ " FOR d IN data INSERT d INTO Characters'\n " ,
263
+ " )"
264
+ ],
265
+ "execution_count" : 0 ,
266
+ "outputs" : []
267
+ },
268
+ {
269
+ "cell_type" : " markdown" ,
270
+ "metadata" : {
271
+ "id" : " u_ftzlE3D0Po" ,
272
+ "colab_type" : " text"
273
+ },
274
+ "source" : [
275
+ " The LET keyword defines a variable with name data and an array of objects as value, so LET variableName = valueExpression and the expression being a literal array definition like [ {...}, {...}, ... ].\n " ,
276
+ " \n " ,
277
+ " FOR variableName IN expression is used to iterate over each element of the data array. In each loop, one element is assigned to the variable d. This variable is then used in the INSERT statement instead of a literal object definition. What is does is basically:"
278
+ ]
279
+ },
280
+ {
281
+ "cell_type" : " code" ,
282
+ "metadata" : {
283
+ "id" : " Bk-EvGk-GeFH" ,
284
+ "colab_type" : " code" ,
285
+ "colab" : {
286
+ "base_uri" : " https://localhost:8080/" ,
287
+ "height" : 799
288
+ },
289
+ "outputId" : " 041407a3-51f1-473c-d36e-acd3e6e9964c"
290
+ },
291
+ "source" : [
292
+ " # Print all characters from Python Driver\n " ,
293
+ " for character in db.collection('Characters'):\n " ,
294
+ " print(\" - %s\" % character['name'])"
295
+ ],
296
+ "execution_count" : 11 ,
297
+ "outputs" : [
298
+ {
299
+ "output_type" : " stream" ,
300
+ "text" : [
301
+ " - Ned\n " ,
302
+ " - Robert\n " ,
303
+ " - Jaime\n " ,
304
+ " - Catelyn\n " ,
305
+ " - Cersei\n " ,
306
+ " - Daenerys\n " ,
307
+ " - Jorah\n " ,
308
+ " - Petyr\n " ,
309
+ " - Viserys\n " ,
310
+ " - Jon\n " ,
311
+ " - Sansa\n " ,
312
+ " - Arya\n " ,
313
+ " - Robb\n " ,
314
+ " - Theon\n " ,
315
+ " - Bran\n " ,
316
+ " - Joffrey\n " ,
317
+ " - Sandor\n " ,
318
+ " - Tyrion\n " ,
319
+ " - Khal\n " ,
320
+ " - Tywin\n " ,
321
+ " - Davos\n " ,
322
+ " - Samwell\n " ,
323
+ " - Stannis\n " ,
324
+ " - Melisandre\n " ,
325
+ " - Margaery\n " ,
326
+ " - Jeor\n " ,
327
+ " - Bronn\n " ,
328
+ " - Varys\n " ,
329
+ " - Shae\n " ,
330
+ " - Talisa\n " ,
331
+ " - Gendry\n " ,
332
+ " - Ygritte\n " ,
333
+ " - Tormund\n " ,
334
+ " - Gilly\n " ,
335
+ " - Brienne\n " ,
336
+ " - Ramsay\n " ,
337
+ " - Ellaria\n " ,
338
+ " - Daario\n " ,
339
+ " - Missandei\n " ,
340
+ " - Tommen\n " ,
341
+ " - Jaqen\n " ,
342
+ " - Roose\n " ,
343
+ " - The High Sparrow\n " ,
344
+ " - Robert\n " ,
345
+ " - Jaime\n " ,
346
+ " - Ned\n "
347
+ ],
348
+ "name" : " stdout"
349
+ }
350
+ ]
351
+ },
352
+ {
353
+ "cell_type" : " code" ,
354
+ "metadata" : {
355
+ "id" : " Scw6LAZZD06P" ,
356
+ "colab_type" : " code" ,
357
+ "colab" : {
358
+ "base_uri" : " https://localhost:8080/" ,
359
+ "height" : 34
360
+ },
361
+ "outputId" : " d477c77b-816e-4ab8-a1f6-548c401f5981"
362
+ },
363
+ "source" : [
364
+ " cursor = aql.execute('INSERT {'\n " ,
365
+ " '\" name\" : \" Robert\" ,'\n " ,
366
+ " '\" surname\" : \" Baratheon\" ,'\n " ,
367
+ " '\" alive\" : false,'\n " ,
368
+ " '\" traits\" : [\" A\" ,\" H\" ,\" C\" ]'\n " ,
369
+ " '} INTO Characters'\n " ,
370
+ " )\n " ,
371
+ " cursor = aql.execute(\n " ,
372
+ " 'INSERT {'\n " ,
373
+ " '\" name\" : \" Jaime\" ,'\n " ,
374
+ " '\" surname\" : \" Lannister\" ,'\n " ,
375
+ " '\" alive\" : true,'\n " ,
376
+ " '\" age\" : 36,'\n " ,
377
+ " '\" traits\" : [\" A\" ,\" F\" ,\" B\" ]'\n " ,
378
+ " '} INTO Characters'\n " ,
379
+ " )\n " ,
380
+ " \n " ,
381
+ " print(cursor)"
382
+ ],
383
+ "execution_count" : 7 ,
384
+ "outputs" : [
385
+ {
386
+ "output_type" : " stream" ,
387
+ "text" : [
388
+ " <Cursor>\n "
389
+ ],
390
+ "name" : " stdout"
391
+ }
392
+ ]
393
+ },
394
+ {
395
+ "cell_type" : " markdown" ,
396
+ "metadata" : {
397
+ "id" : " BzlILU_sEtAp" ,
398
+ "colab_type" : " text"
399
+ },
400
+ "source" : [
401
+ " Note: AQL does not permit multiple INSERT operations that target the same collection in a single query. It is allowed as body of a FOR loop however, inserting multiple documents like we did with above query."
402
+ ]
403
+ }
404
+ ]
405
+ }
0 commit comments