@linklabjs/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/README.md +411 -0
  2. package/package.json +48 -0
  3. package/src/api/DomainNode.ts +1433 -0
  4. package/src/api/Graph.ts +271 -0
  5. package/src/api/PathBuilder.ts +247 -0
  6. package/src/api/index.ts +15 -0
  7. package/src/api/loadGraph.ts +207 -0
  8. package/src/api/test-api.ts +153 -0
  9. package/src/api/test-domain.ts +119 -0
  10. package/src/api/types.ts +88 -0
  11. package/src/config/synonyms.json +28 -0
  12. package/src/core/EventBus.ts +187 -0
  13. package/src/core/GraphEvents.ts +153 -0
  14. package/src/core/PathFinder.ts +283 -0
  15. package/src/formatters/BaseFormatter.ts +17 -0
  16. package/src/graph/GraphAssembler.ts +50 -0
  17. package/src/graph/GraphCompiler.ts +412 -0
  18. package/src/graph/GraphExtractor.ts +191 -0
  19. package/src/graph/GraphOptimizer.ts +404 -0
  20. package/src/graph/GraphTrainer.ts +247 -0
  21. package/src/http/LinkBuilder.ts +244 -0
  22. package/src/http/TrailRequest.ts +48 -0
  23. package/src/http/example-netflix.ts +59 -0
  24. package/src/http/hateoas/README.md +87 -0
  25. package/src/http/index.ts +33 -0
  26. package/src/http/plugin.ts +360 -0
  27. package/src/index.ts +121 -0
  28. package/src/instrumentation/TelemetryShim.ts +172 -0
  29. package/src/navigation/NavigationEngine.ts +441 -0
  30. package/src/navigation/Resolver.ts +134 -0
  31. package/src/navigation/Scheduler.ts +136 -0
  32. package/src/navigation/Trail.ts +252 -0
  33. package/src/navigation/TrailParser.ts +207 -0
  34. package/src/navigation/index.ts +11 -0
  35. package/src/providers/MockProvider.ts +68 -0
  36. package/src/providers/PostgresProvider.ts +187 -0
  37. package/src/runtime/CompiledGraphEngine.ts +274 -0
  38. package/src/runtime/DataLoader.ts +236 -0
  39. package/src/runtime/Engine.ts +163 -0
  40. package/src/runtime/QueryEngine.ts +222 -0
  41. package/src/scenarios/test-metro-paris/config.json +6 -0
  42. package/src/scenarios/test-metro-paris/graph.json +16325 -0
  43. package/src/scenarios/test-metro-paris/queries.ts +152 -0
  44. package/src/scenarios/test-metro-paris/stack.json +1 -0
  45. package/src/scenarios/test-musicians/config.json +10 -0
  46. package/src/scenarios/test-musicians/graph.json +20 -0
  47. package/src/scenarios/test-musicians/stack.json +1 -0
  48. package/src/scenarios/test-netflix/MIGRATION.md +23 -0
  49. package/src/scenarios/test-netflix/README.md +138 -0
  50. package/src/scenarios/test-netflix/actions.ts +92 -0
  51. package/src/scenarios/test-netflix/config.json +6 -0
  52. package/src/scenarios/test-netflix/data/categories.json +1 -0
  53. package/src/scenarios/test-netflix/data/companies.json +1 -0
  54. package/src/scenarios/test-netflix/data/credits.json +19797 -0
  55. package/src/scenarios/test-netflix/data/departments.json +18 -0
  56. package/src/scenarios/test-netflix/data/jobs.json +142 -0
  57. package/src/scenarios/test-netflix/data/movies.json +3497 -0
  58. package/src/scenarios/test-netflix/data/people.json +1 -0
  59. package/src/scenarios/test-netflix/data/synonyms.json +8 -0
  60. package/src/scenarios/test-netflix/data/users.json +70 -0
  61. package/src/scenarios/test-netflix/graph.json +1017 -0
  62. package/src/scenarios/test-netflix/queries.ts +159 -0
  63. package/src/scenarios/test-netflix/stack.json +14 -0
  64. package/src/schema/GraphBuilder.ts +106 -0
  65. package/src/schema/JsonSchemaExtractor.ts +107 -0
  66. package/src/schema/SchemaAnalyzer.ts +175 -0
  67. package/src/schema/SchemaExtractor.ts +102 -0
  68. package/src/schema/SynonymResolver.ts +143 -0
  69. package/src/scripts/dictionary.json +796 -0
  70. package/src/scripts/graph.json +664 -0
  71. package/src/scripts/regenerate.ts +248 -0
  72. package/src/types/index.ts +506 -0
@@ -0,0 +1,796 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "generatedAt": "2026-02-27T17:14:01.899Z",
4
+ "database": {
5
+ "name": "dvdrental",
6
+ "type": "postgresql"
7
+ },
8
+ "tables": {
9
+ "actor": {
10
+ "name": "actor",
11
+ "label": "Actor",
12
+ "rowCount": 200,
13
+ "description": "",
14
+ "columns": [
15
+ {
16
+ "name": "actor_id",
17
+ "type": "integer",
18
+ "description": "",
19
+ "label": "Actor Id"
20
+ },
21
+ {
22
+ "name": "first_name",
23
+ "type": "character varying",
24
+ "description": "",
25
+ "label": "First Name"
26
+ },
27
+ {
28
+ "name": "last_name",
29
+ "type": "character varying",
30
+ "description": "",
31
+ "label": "Last Name"
32
+ },
33
+ {
34
+ "name": "last_update",
35
+ "type": "timestamp without time zone",
36
+ "description": "",
37
+ "label": "Last Update"
38
+ }
39
+ ]
40
+ },
41
+ "store": {
42
+ "name": "store",
43
+ "label": "Store",
44
+ "rowCount": 2,
45
+ "description": "",
46
+ "columns": [
47
+ {
48
+ "name": "store_id",
49
+ "type": "integer",
50
+ "description": "",
51
+ "label": "Store Id"
52
+ },
53
+ {
54
+ "name": "manager_staff_id",
55
+ "type": "smallint",
56
+ "description": "",
57
+ "label": "Manager Staff Id"
58
+ },
59
+ {
60
+ "name": "address_id",
61
+ "type": "smallint",
62
+ "description": "",
63
+ "label": "Address Id"
64
+ },
65
+ {
66
+ "name": "last_update",
67
+ "type": "timestamp without time zone",
68
+ "description": "",
69
+ "label": "Last Update"
70
+ }
71
+ ]
72
+ },
73
+ "address": {
74
+ "name": "address",
75
+ "label": "Address",
76
+ "rowCount": 603,
77
+ "description": "",
78
+ "columns": [
79
+ {
80
+ "name": "address_id",
81
+ "type": "integer",
82
+ "description": "",
83
+ "label": "Address Id"
84
+ },
85
+ {
86
+ "name": "address",
87
+ "type": "character varying",
88
+ "description": "",
89
+ "label": "Address"
90
+ },
91
+ {
92
+ "name": "address2",
93
+ "type": "character varying",
94
+ "description": "",
95
+ "label": "Address2"
96
+ },
97
+ {
98
+ "name": "district",
99
+ "type": "character varying",
100
+ "description": "",
101
+ "label": "District"
102
+ },
103
+ {
104
+ "name": "city_id",
105
+ "type": "smallint",
106
+ "description": "",
107
+ "label": "City Id"
108
+ },
109
+ {
110
+ "name": "postal_code",
111
+ "type": "character varying",
112
+ "description": "",
113
+ "label": "Postal Code"
114
+ },
115
+ {
116
+ "name": "phone",
117
+ "type": "character varying",
118
+ "description": "",
119
+ "label": "Phone"
120
+ },
121
+ {
122
+ "name": "last_update",
123
+ "type": "timestamp without time zone",
124
+ "description": "",
125
+ "label": "Last Update"
126
+ }
127
+ ]
128
+ },
129
+ "category": {
130
+ "name": "category",
131
+ "label": "Category",
132
+ "rowCount": 16,
133
+ "description": "",
134
+ "columns": [
135
+ {
136
+ "name": "category_id",
137
+ "type": "integer",
138
+ "description": "",
139
+ "label": "Category Id"
140
+ },
141
+ {
142
+ "name": "name",
143
+ "type": "character varying",
144
+ "description": "",
145
+ "label": "Name"
146
+ },
147
+ {
148
+ "name": "last_update",
149
+ "type": "timestamp without time zone",
150
+ "description": "",
151
+ "label": "Last Update"
152
+ }
153
+ ]
154
+ },
155
+ "city": {
156
+ "name": "city",
157
+ "label": "City",
158
+ "rowCount": 600,
159
+ "description": "",
160
+ "columns": [
161
+ {
162
+ "name": "city_id",
163
+ "type": "integer",
164
+ "description": "",
165
+ "label": "City Id"
166
+ },
167
+ {
168
+ "name": "city",
169
+ "type": "character varying",
170
+ "description": "",
171
+ "label": "City"
172
+ },
173
+ {
174
+ "name": "country_id",
175
+ "type": "smallint",
176
+ "description": "",
177
+ "label": "Country Id"
178
+ },
179
+ {
180
+ "name": "last_update",
181
+ "type": "timestamp without time zone",
182
+ "description": "",
183
+ "label": "Last Update"
184
+ }
185
+ ]
186
+ },
187
+ "country": {
188
+ "name": "country",
189
+ "label": "Country",
190
+ "rowCount": 109,
191
+ "description": "",
192
+ "columns": [
193
+ {
194
+ "name": "country_id",
195
+ "type": "integer",
196
+ "description": "",
197
+ "label": "Country Id"
198
+ },
199
+ {
200
+ "name": "country",
201
+ "type": "character varying",
202
+ "description": "",
203
+ "label": "Country"
204
+ },
205
+ {
206
+ "name": "last_update",
207
+ "type": "timestamp without time zone",
208
+ "description": "",
209
+ "label": "Last Update"
210
+ }
211
+ ]
212
+ },
213
+ "customer": {
214
+ "name": "customer",
215
+ "label": "Customer",
216
+ "rowCount": 599,
217
+ "description": "",
218
+ "columns": [
219
+ {
220
+ "name": "customer_id",
221
+ "type": "integer",
222
+ "description": "",
223
+ "label": "Customer Id"
224
+ },
225
+ {
226
+ "name": "store_id",
227
+ "type": "smallint",
228
+ "description": "",
229
+ "label": "Store Id"
230
+ },
231
+ {
232
+ "name": "first_name",
233
+ "type": "character varying",
234
+ "description": "",
235
+ "label": "First Name"
236
+ },
237
+ {
238
+ "name": "last_name",
239
+ "type": "character varying",
240
+ "description": "",
241
+ "label": "Last Name"
242
+ },
243
+ {
244
+ "name": "email",
245
+ "type": "character varying",
246
+ "description": "",
247
+ "label": "Email"
248
+ },
249
+ {
250
+ "name": "address_id",
251
+ "type": "smallint",
252
+ "description": "",
253
+ "label": "Address Id"
254
+ },
255
+ {
256
+ "name": "activebool",
257
+ "type": "boolean",
258
+ "description": "",
259
+ "label": "Activebool"
260
+ },
261
+ {
262
+ "name": "create_date",
263
+ "type": "date",
264
+ "description": "",
265
+ "label": "Create Date"
266
+ },
267
+ {
268
+ "name": "last_update",
269
+ "type": "timestamp without time zone",
270
+ "description": "",
271
+ "label": "Last Update"
272
+ },
273
+ {
274
+ "name": "active",
275
+ "type": "integer",
276
+ "description": "",
277
+ "label": "Active"
278
+ }
279
+ ]
280
+ },
281
+ "film_actor": {
282
+ "name": "film_actor",
283
+ "label": "Film Actor",
284
+ "rowCount": 5462,
285
+ "description": "",
286
+ "columns": [
287
+ {
288
+ "name": "actor_id",
289
+ "type": "smallint",
290
+ "description": "",
291
+ "label": "Actor Id"
292
+ },
293
+ {
294
+ "name": "film_id",
295
+ "type": "smallint",
296
+ "description": "",
297
+ "label": "Film Id"
298
+ },
299
+ {
300
+ "name": "last_update",
301
+ "type": "timestamp without time zone",
302
+ "description": "",
303
+ "label": "Last Update"
304
+ }
305
+ ]
306
+ },
307
+ "film_category": {
308
+ "name": "film_category",
309
+ "label": "Film Category",
310
+ "rowCount": 1000,
311
+ "description": "",
312
+ "columns": [
313
+ {
314
+ "name": "film_id",
315
+ "type": "smallint",
316
+ "description": "",
317
+ "label": "Film Id"
318
+ },
319
+ {
320
+ "name": "category_id",
321
+ "type": "smallint",
322
+ "description": "",
323
+ "label": "Category Id"
324
+ },
325
+ {
326
+ "name": "last_update",
327
+ "type": "timestamp without time zone",
328
+ "description": "",
329
+ "label": "Last Update"
330
+ }
331
+ ]
332
+ },
333
+ "inventory": {
334
+ "name": "inventory",
335
+ "label": "Inventory",
336
+ "rowCount": 4581,
337
+ "description": "",
338
+ "columns": [
339
+ {
340
+ "name": "inventory_id",
341
+ "type": "integer",
342
+ "description": "",
343
+ "label": "Inventory Id"
344
+ },
345
+ {
346
+ "name": "film_id",
347
+ "type": "smallint",
348
+ "description": "",
349
+ "label": "Film Id"
350
+ },
351
+ {
352
+ "name": "store_id",
353
+ "type": "smallint",
354
+ "description": "",
355
+ "label": "Store Id"
356
+ },
357
+ {
358
+ "name": "last_update",
359
+ "type": "timestamp without time zone",
360
+ "description": "",
361
+ "label": "Last Update"
362
+ }
363
+ ]
364
+ },
365
+ "language": {
366
+ "name": "language",
367
+ "label": "Language",
368
+ "rowCount": 6,
369
+ "description": "",
370
+ "columns": [
371
+ {
372
+ "name": "language_id",
373
+ "type": "integer",
374
+ "description": "",
375
+ "label": "Language Id"
376
+ },
377
+ {
378
+ "name": "name",
379
+ "type": "character",
380
+ "description": "",
381
+ "label": "Name"
382
+ },
383
+ {
384
+ "name": "last_update",
385
+ "type": "timestamp without time zone",
386
+ "description": "",
387
+ "label": "Last Update"
388
+ }
389
+ ]
390
+ },
391
+ "rental": {
392
+ "name": "rental",
393
+ "label": "Rental",
394
+ "rowCount": 16044,
395
+ "description": "",
396
+ "columns": [
397
+ {
398
+ "name": "rental_id",
399
+ "type": "integer",
400
+ "description": "",
401
+ "label": "Rental Id"
402
+ },
403
+ {
404
+ "name": "rental_date",
405
+ "type": "timestamp without time zone",
406
+ "description": "",
407
+ "label": "Rental Date"
408
+ },
409
+ {
410
+ "name": "inventory_id",
411
+ "type": "integer",
412
+ "description": "",
413
+ "label": "Inventory Id"
414
+ },
415
+ {
416
+ "name": "customer_id",
417
+ "type": "smallint",
418
+ "description": "",
419
+ "label": "Customer Id"
420
+ },
421
+ {
422
+ "name": "return_date",
423
+ "type": "timestamp without time zone",
424
+ "description": "",
425
+ "label": "Return Date"
426
+ },
427
+ {
428
+ "name": "staff_id",
429
+ "type": "smallint",
430
+ "description": "",
431
+ "label": "Staff Id"
432
+ },
433
+ {
434
+ "name": "last_update",
435
+ "type": "timestamp without time zone",
436
+ "description": "",
437
+ "label": "Last Update"
438
+ }
439
+ ]
440
+ },
441
+ "staff": {
442
+ "name": "staff",
443
+ "label": "Staff",
444
+ "rowCount": 2,
445
+ "description": "",
446
+ "columns": [
447
+ {
448
+ "name": "staff_id",
449
+ "type": "integer",
450
+ "description": "",
451
+ "label": "Staff Id"
452
+ },
453
+ {
454
+ "name": "first_name",
455
+ "type": "character varying",
456
+ "description": "",
457
+ "label": "First Name"
458
+ },
459
+ {
460
+ "name": "last_name",
461
+ "type": "character varying",
462
+ "description": "",
463
+ "label": "Last Name"
464
+ },
465
+ {
466
+ "name": "address_id",
467
+ "type": "smallint",
468
+ "description": "",
469
+ "label": "Address Id"
470
+ },
471
+ {
472
+ "name": "email",
473
+ "type": "character varying",
474
+ "description": "",
475
+ "label": "Email"
476
+ },
477
+ {
478
+ "name": "store_id",
479
+ "type": "smallint",
480
+ "description": "",
481
+ "label": "Store Id"
482
+ },
483
+ {
484
+ "name": "active",
485
+ "type": "boolean",
486
+ "description": "",
487
+ "label": "Active"
488
+ },
489
+ {
490
+ "name": "username",
491
+ "type": "character varying",
492
+ "description": "",
493
+ "label": "Username"
494
+ },
495
+ {
496
+ "name": "password",
497
+ "type": "character varying",
498
+ "description": "",
499
+ "label": "Password"
500
+ },
501
+ {
502
+ "name": "last_update",
503
+ "type": "timestamp without time zone",
504
+ "description": "",
505
+ "label": "Last Update"
506
+ },
507
+ {
508
+ "name": "picture",
509
+ "type": "bytea",
510
+ "description": "",
511
+ "label": "Picture"
512
+ }
513
+ ]
514
+ },
515
+ "payment": {
516
+ "name": "payment",
517
+ "label": "Payment",
518
+ "rowCount": 14596,
519
+ "description": "",
520
+ "columns": [
521
+ {
522
+ "name": "payment_id",
523
+ "type": "integer",
524
+ "description": "",
525
+ "label": "Payment Id"
526
+ },
527
+ {
528
+ "name": "customer_id",
529
+ "type": "smallint",
530
+ "description": "",
531
+ "label": "Customer Id"
532
+ },
533
+ {
534
+ "name": "staff_id",
535
+ "type": "smallint",
536
+ "description": "",
537
+ "label": "Staff Id"
538
+ },
539
+ {
540
+ "name": "rental_id",
541
+ "type": "integer",
542
+ "description": "",
543
+ "label": "Rental Id"
544
+ },
545
+ {
546
+ "name": "amount",
547
+ "type": "numeric",
548
+ "description": "",
549
+ "label": "Amount"
550
+ },
551
+ {
552
+ "name": "payment_date",
553
+ "type": "timestamp without time zone",
554
+ "description": "",
555
+ "label": "Payment Date"
556
+ }
557
+ ]
558
+ },
559
+ "film": {
560
+ "name": "film",
561
+ "label": "Film",
562
+ "rowCount": 1000,
563
+ "description": "",
564
+ "columns": [
565
+ {
566
+ "name": "film_id",
567
+ "type": "integer",
568
+ "description": "",
569
+ "label": "Film Id"
570
+ },
571
+ {
572
+ "name": "title",
573
+ "type": "character varying",
574
+ "description": "",
575
+ "label": "Title"
576
+ },
577
+ {
578
+ "name": "description",
579
+ "type": "text",
580
+ "description": "",
581
+ "label": "Description"
582
+ },
583
+ {
584
+ "name": "release_year",
585
+ "type": "integer",
586
+ "description": "",
587
+ "label": "Release Year"
588
+ },
589
+ {
590
+ "name": "language_id",
591
+ "type": "smallint",
592
+ "description": "",
593
+ "label": "Language Id"
594
+ },
595
+ {
596
+ "name": "rental_duration",
597
+ "type": "smallint",
598
+ "description": "",
599
+ "label": "Rental Duration"
600
+ },
601
+ {
602
+ "name": "rental_rate",
603
+ "type": "numeric",
604
+ "description": "",
605
+ "label": "Rental Rate"
606
+ },
607
+ {
608
+ "name": "length",
609
+ "type": "smallint",
610
+ "description": "",
611
+ "label": "Length"
612
+ },
613
+ {
614
+ "name": "replacement_cost",
615
+ "type": "numeric",
616
+ "description": "",
617
+ "label": "Replacement Cost"
618
+ },
619
+ {
620
+ "name": "rating",
621
+ "type": "USER-DEFINED",
622
+ "description": "",
623
+ "label": "Rating"
624
+ },
625
+ {
626
+ "name": "last_update",
627
+ "type": "timestamp without time zone",
628
+ "description": "",
629
+ "label": "Last Update"
630
+ },
631
+ {
632
+ "name": "special_features",
633
+ "type": "ARRAY",
634
+ "description": "",
635
+ "label": "Special Features"
636
+ },
637
+ {
638
+ "name": "fulltext",
639
+ "type": "tsvector",
640
+ "description": "",
641
+ "label": "Fulltext"
642
+ }
643
+ ]
644
+ }
645
+ },
646
+ "relations": [
647
+ {
648
+ "via": "address_id",
649
+ "type": "foreign_key",
650
+ "label": "Unknown ➔ Unknown",
651
+ "cardinality": "one-to-many",
652
+ "description": "Lien sémantique via address_id"
653
+ },
654
+ {
655
+ "via": "actor_id",
656
+ "type": "foreign_key",
657
+ "label": "Unknown ➔ Unknown",
658
+ "cardinality": "one-to-many",
659
+ "description": "Lien sémantique via actor_id"
660
+ },
661
+ {
662
+ "via": "film_id",
663
+ "type": "foreign_key",
664
+ "label": "Unknown ➔ Unknown",
665
+ "cardinality": "one-to-many",
666
+ "description": "Lien sémantique via film_id"
667
+ },
668
+ {
669
+ "via": "category_id",
670
+ "type": "foreign_key",
671
+ "label": "Unknown ➔ Unknown",
672
+ "cardinality": "one-to-many",
673
+ "description": "Lien sémantique via category_id"
674
+ },
675
+ {
676
+ "via": "film_id",
677
+ "type": "foreign_key",
678
+ "label": "Unknown ➔ Unknown",
679
+ "cardinality": "one-to-many",
680
+ "description": "Lien sémantique via film_id"
681
+ },
682
+ {
683
+ "via": "language_id",
684
+ "type": "foreign_key",
685
+ "label": "Unknown ➔ Unknown",
686
+ "cardinality": "one-to-many",
687
+ "description": "Lien sémantique via language_id"
688
+ },
689
+ {
690
+ "via": "city_id",
691
+ "type": "foreign_key",
692
+ "label": "Unknown ➔ Unknown",
693
+ "cardinality": "one-to-many",
694
+ "description": "Lien sémantique via city_id"
695
+ },
696
+ {
697
+ "via": "country_id",
698
+ "type": "foreign_key",
699
+ "label": "Unknown ➔ Unknown",
700
+ "cardinality": "one-to-many",
701
+ "description": "Lien sémantique via country_id"
702
+ },
703
+ {
704
+ "via": "film_id",
705
+ "type": "foreign_key",
706
+ "label": "Unknown ➔ Unknown",
707
+ "cardinality": "one-to-many",
708
+ "description": "Lien sémantique via film_id"
709
+ },
710
+ {
711
+ "via": "customer_id",
712
+ "type": "foreign_key",
713
+ "label": "Unknown ➔ Unknown",
714
+ "cardinality": "one-to-many",
715
+ "description": "Lien sémantique via customer_id"
716
+ },
717
+ {
718
+ "via": "rental_id",
719
+ "type": "foreign_key",
720
+ "label": "Unknown ➔ Unknown",
721
+ "cardinality": "one-to-many",
722
+ "description": "Lien sémantique via rental_id"
723
+ },
724
+ {
725
+ "via": "staff_id",
726
+ "type": "foreign_key",
727
+ "label": "Unknown ➔ Unknown",
728
+ "cardinality": "one-to-many",
729
+ "description": "Lien sémantique via staff_id"
730
+ },
731
+ {
732
+ "via": "customer_id",
733
+ "type": "foreign_key",
734
+ "label": "Unknown ➔ Unknown",
735
+ "cardinality": "one-to-many",
736
+ "description": "Lien sémantique via customer_id"
737
+ },
738
+ {
739
+ "via": "inventory_id",
740
+ "type": "foreign_key",
741
+ "label": "Unknown ➔ Unknown",
742
+ "cardinality": "one-to-many",
743
+ "description": "Lien sémantique via inventory_id"
744
+ },
745
+ {
746
+ "via": "staff_id",
747
+ "type": "foreign_key",
748
+ "label": "Unknown ➔ Unknown",
749
+ "cardinality": "one-to-many",
750
+ "description": "Lien sémantique via staff_id"
751
+ },
752
+ {
753
+ "via": "address_id",
754
+ "type": "foreign_key",
755
+ "label": "Unknown ➔ Unknown",
756
+ "cardinality": "one-to-many",
757
+ "description": "Lien sémantique via address_id"
758
+ },
759
+ {
760
+ "via": "address_id",
761
+ "type": "foreign_key",
762
+ "label": "Unknown ➔ Unknown",
763
+ "cardinality": "one-to-many",
764
+ "description": "Lien sémantique via address_id"
765
+ },
766
+ {
767
+ "via": "manager_staff_id",
768
+ "type": "foreign_key",
769
+ "label": "Unknown ➔ Unknown",
770
+ "cardinality": "one-to-many",
771
+ "description": "Lien sémantique via manager_staff_id"
772
+ }
773
+ ],
774
+ "labels": {
775
+ "actor": "Actor",
776
+ "store": "Store",
777
+ "address": "Address",
778
+ "category": "Category",
779
+ "city": "City",
780
+ "country": "Country",
781
+ "customer": "Customer",
782
+ "film_actor": "Film Actor",
783
+ "film_category": "Film Category",
784
+ "inventory": "Inventory",
785
+ "language": "Language",
786
+ "rental": "Rental",
787
+ "staff": "Staff",
788
+ "payment": "Payment",
789
+ "film": "Film"
790
+ },
791
+ "metadata": {
792
+ "totalTables": 15,
793
+ "totalRelations": 18,
794
+ "avgColumnsPerTable": 6
795
+ }
796
+ }