Domanda

Viene dal punto di vista dei big data. Fondamentalmente, molti framework (come Apache Spark) "compensano" la mancanza di operazioni relazionali fornendo interfacce functor/monad e c'è un movimento simile per le conversioni da gatti a SQL (Slick in Scala). Ad esempio, abbiamo bisogno di un join naturale (non assumendo ripetizioni sugli indici) per la moltiplicazione a livello di elemento dei vettori da SQL-PERSpective, che potrebbe essere considerato come come zip + map(multiply) (MLIB di Spark, tuttavia, lo ha già fatto ElementwiseProduct) nelle applicazioni della teoria della categoria.

Semplicemente dicendo (i seguenti esempi sono in Scala):

  • La sottocase di riferimento di join può essere considerata come funtore applicativa (collezione eccessiva), che a sua volta ci dà zip: List(1,2,3).ap(List(2,4,8).map(a => (b: Int) => a * b)) --> (List(1,2,3) zip List(2,4,8)).map(x => x._1 * x._2). Inoltre, possiamo inducarlo ad alcuni altri join, supponendo un po 'di preelaborazione (groupBy Operatore o semplicemente Suriezione, o generalmente - un epimorfismo).

  • Altri join e selezione possono essere pensati come monadi. Per esempio, WHERE è solo: List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty) --> List(1,2,2,4).filter(_ < 3)

  • I dati stessi sono solo ADT (anche GADT?), Che a sua volta sembra una semplice categoria set (o più in generale-chiusa cartesiana), quindi dovrebbe (suppongo) coprire le operazioni basate su set (a causa del curry- Howard-Lambek stesso) e anche operazioni come RENAME (almeno in pratica).

  • L'aggregazione corrisponde a fold/reduce (Catamorfismo)

Quindi, quello che sto chiedendo è che possiamo costruire un isomorfismo tra la teoria della categoria (forse sottoinsieme) e (il tutto) algebra relazionale o c'è qualcosa di scoperto? Se funziona, quale esatto "sottoinsieme" delle categorie è isomorfo per la relalgebra?

Puoi vedere che i miei presupposti sono piuttosto ampi mentre soluzioni formali come Curry-Howard-Lambek corrispondenza per logic-cats-lambda sono più precisi - quindi in realtà, sto chiedendo un riferimento a uno studio esperto (che mostra una relazione diretta) con più esempi in Scala/Haskell.

Modificare: La risposta accettata mi ha fatto pensare che sono andato troppo lontano a rappresentare i join e le condizioni come una monade (in particolare usando un valore vuoto che è effettivamente istanziato falso), penso che i pullback dovrebbero essere sufficienti almeno per il sottoinsieme di SQL. Le monadi sono migliori per le cose di ordine superiore (nidificante) come il gruppo di, che non fa parte di Relalgebra.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a cs.stackexchange
scroll top