Astratto
Sto lavorando su un'interfaccia REST a un database grafico (Titan / Gremlin-Server, ma questo non dovrebbe importare) che ha un strong senso del tipo per vertici e spigoli. Mi piacerebbe progettare un'API REST per eseguire operazioni CRUD mentre impongo alcune informazioni sul tipo.
Panoramica
Lo scopo di questo database è di modellare il flusso di informazioni (un'unità di cui è chiamato un messaggio ) tra vari attori , tenendo traccia di canali che mediano il routing dei messaggi. Ad esempio, si può dire che un YouTuber (tipo: attore) produce un video (tipo: messaggio) e lo distribuisce tramite un canale YouTube (tipo: canale), a cui è iscritto un altro YouTuber (tipo: attore).
Il modello dati è il seguente con i vertici rappresentati come caselle e spigoli rappresentati come frecce:
                              publish
|***************| ---------------------------------> |*******************|
|               |                                    |                   |
|               |  produce   |*********|  distribute |                   |
|    Actor      | ---------> |         | ----------> |      Channel      |
|               |            | Message |             |                   |
|               | <--------- |         | <---------- |                   |
|               |  notify    |*********|   deliver   |                   |
|               |                                    |                   |
|***************| <--------------------------------- |*******************|
                              subscribe
Per aiutare a capire, si dice che:
- Un attore pubblica su un canale
- Un attore produce un messaggio
- Un messaggio notifica un attore (inversamente dichiarato: un attore riceve notifica di un messaggio)
- Un messaggio viene distribuito tramite un canale
- Un canale recapita un messaggio (inversamente dichiarato: un messaggio è fornito da un canale)
- Un canale sottoscrive un attore (inversamente dichiarato: un attore è iscritto a un canale)
 Si noti come i tipi dei vertici in ogni operazione di creazione di un bordo,   createE(v1, v2)   , determina il tipo di bordo che viene creato. Ad esempio, un margine da   Actor    a   Message    è necessariamente un margine   produce   . Allo stesso modo, un margine da   Channel    a   Actor    è necessariamente un margine   subscribe   . 
N.B.: Vertices in this model constitute (I think...) a mathematical category. We can think of edges as functions that map one category to another. For example, the function that takes us from an
Actorto aChannelis calledpublish, and is equivalent todistribute ∘ produce. I mention this because I had these principles in mind when designing the data model ... perhaps they can be leveraged for a REST API?
Dichiarazione del problema
Dato il modello di dati sopra, ho bisogno di creare un'API REST che supporti le operazioni CRUD di base sia per i vertici che per i bordi. Come minimo, l'API dovrebbe:
- Operare su entrambe le singole risorse e raccolte
-  Fornire un meccanismo per vincolare i vertici / i bordi su cui opera una determinata chiamata API (un esempio informale e non esaustivo: "Voglio creare uno spigolo che va dal vertice con UUID   5F1506A2-4824-416D-95F2-BC2D82B15A29a tutti i vertici creati nel ultima ora)
-  Inferere il tipo di bordo da creare in base ai tipi di vertice di origine e di destinazione, con l'intento di  convalidare i dati forniti dall'utente  (es .:   createE(some_actor, some_message)dovrebbe creare implicitamenteproduce- digita il bordo).
Approccio attuale
Una delle proprietà più belle di questo modello di dati è che il tipo di bordo è completamente determinato dai vertici a ciascuna estremità e, inversamente, una coppia di vertici può essere digitata in base al tipo e alla direzione di un bordo. Questo rende possibile fare cose come:
POST /:srcV/:dstV
{ edge JSON data goes here }
 In tal modo, possiamo convalidare il contenuto dei dati JSON di bordo, assicurandoci che corrisponda al tipo di bordo creato implicitamente. Per maggiore chiarezza,   :srcV    e   :dstV    sono variabili che conterranno   AGENT   ,   MESSAGE    o   CHANNEL   . 
Tuttavia, mancano alcune cose:
- come rappresento i vincoli
- come devono essere trasmessi i vincoli su HTTP (parametri della query?)
- come faccio a distinguere tra risorse e raccolte di risorse?
 La domanda   2    è di particolare importanza perché voglio essere in grado di   DELETE    una raccolta di risorse basata su vincoli. Ad esempio, "rimuovi tutti i bordi del tipo   publish    per cui l'attore è iscritto a un determinato canale". 
Questa è la prima volta che eseguo un lavoro non banale con REST, e mi sembra di incarnare questo modello di dati in qualcosa che potrebbe non adattarsi necessariamente. Pertanto, la mia domanda è duplice:
- Qualcuno può indicarmi la giusta direzione? Qualche idea su come dovrebbe essere questa API?
- Eventuali commenti, suggerimenti o critiche?
La mia comprensione è che softwareengineering.stackexchange è per fare "whiteboarding" di sorta, quindi spero che la comunità perdoni la natura aperta di questa domanda. Se ha bisogno di essere ristretto, per favore guidami con le domande e aggiorno di conseguenza.
Molte grazie in anticipo!
Note aggiuntive
-  È possibile (forse anche probabile) che la mia nomenclatura vertice / limite porti alla confusione. Sono aperto ai suggerimenti. 
-  Alcune delle mie ipotesi (in particolare per quanto riguarda la teoria delle categorie) possono essere errate o errate. Le correzioni e le inquisizioni amichevoli sono ben accette!