WQuestions

Parte III · Cómo funcionan juntas

12

Puentes: objetos, bits, grafos y cadenas

Nada de esto es magia, y nada es del todo nuevo. WQuestions se asienta sobre cuatro ideas que el lector técnico ya domina (la programación orientada a objetos, el bit, el grafo y la cadena de bloques). Este capítulo tiende los puentes, y marca dónde el puente sostiene y dónde se rompe.

Imagina a un programador con quince años de oficio leyendo este libro por encima del hombro de un colega. Hacia el capítulo 7 levanta una ceja. «¿Tripletas? —dice—. Eso ya existe. Yo modelo con clases y objetos desde que aprendí a programar; mis datos viven en tablas que se consultan en milisegundos; y eso de los hechos que no se pueden borrar suena a blockchain, una moda que ya pasó.» Tiene razón en cada observación, y por eso vale la pena tomárselo en serio. WQuestions no se inventó en un vacío: respira el mismo aire que la programación orientada a objetos, los bits, las bases de grafos y los libros mayores inmutables. Este capítulo se dedica a contestarle, una objeción a la vez.

El método será siempre el mismo. Para cada tecnología familiar tenderemos un puente (un mapa que muestra qué pieza de WQuestions corresponde a qué pieza que el lector ya conoce) y luego marcaremos el punto exacto donde el puente deja de sostener peso. Porque la analogía sirve para entrar, pero engaña si se la lleva demasiado lejos. Cuatro puentes, cuatro secciones.

Puente uno · Objetos: la programación orientada a objetos

La primera reacción de cualquier ingeniero es la más natural: «esto ya lo hago con clases». Y en parte lleva razón. La programación orientada a objetos (POO) lleva medio siglo organizando el software alrededor de la misma intuición que WQuestions (que el mundo se describe con cosas que pertenecen a categorías y que se relacionan entre sí). El parecido es tan profundo que conviene hacerlo explícito antes de señalar la grieta.

Tres conceptos de la POO tienen un gemelo casi perfecto en el modelo. Cuando un programador escribe v = Venta(...), está instanciando: fabricando un individuo a partir de un molde. Nosotros decimos exactamente lo mismo con el cable instancia_de, que ancla un sujeto del eje O en su clase del eje K. Cuando una clase VentaOnline hereda de Venta, declara que todo lo que vale para una venta vale para una venta en línea; nosotros lo escribimos con subtipo_de entre dos conceptos del eje K. Y los atributos y asociaciones de un objeto (su monto, su vendedor) no son otra cosa que nuestros predicados del eje M.

tripletas
(venta_online,  subtipo_de,    venta)          ∈ M(K, K)   // herencia
(venta_001,     instancia_de,  venta_online)   ∈ M(O, K)   // instanciación
(venta_001,     vendedor,      vendedor_17)     ∈ M(O, Q)   // asociación
(venta_001,     monto_usd,     49.90)           ∈ M(O, N)   // atributo

Para fijar el paralelo, traduzcamos la misma entidad (nuestra venta canónica) a una clase de Python y, justo al lado, a las tripletas equivalentes. Mira primero el código que el programador escéptico reconoce a primera vista:

python
class Venta:
    def __init__(self, id, vendedor, cliente, articulo, monto, momento):
        self.id       = id
        self.vendedor = vendedor      # asociación  → Vendedor
        self.cliente  = cliente       # asociación  → Cliente
        self.articulo = articulo      # asociación  → Articulo
        self.monto    = monto         # atributo    (float)
        self.momento  = momento       # atributo    (datetime)

    def aplicar_descuento(self, pct):     # comportamiento, acoplado al dato
        self.monto *= (1 - pct / 100)

v = Venta("venta_001", vendedor_17, cliente_1042,
          camiseta_88, 49.90, "2026-05-14T16:32")

Y ahora la misma venta como hechos atómicos. Fíjate en que no hay método: el dato está separado de lo que se le hace.

tripletas
(venta_001, instancia_de, venta)          ∈ M(O, K)
(venta_001, vendedor,     vendedor_17)    ∈ M(O, Q)
(venta_001, cliente,      cliente_1042)   ∈ M(O, Q)
(venta_001, objeto,       camiseta_88)    ∈ M(O, O)
(venta_001, monto_usd,    49.90)          ∈ M(O, N)
(venta_001, momento,      2026-05-14T16:32) ∈ M(O, T)

Línea por línea, los atributos de la clase reaparecen como tripletas. La figura siguiente pone las dos representaciones frente a frente: a la izquierda, el objeto como caja cerrada con sus casillas; a la derecha, el mismo hecho desplegado como estrella de nodos en el grafo.

POO · objeto = caja cerrada Venta · venta_001 vendedor = vendedor_17 cliente = cliente_1042 objeto = camiseta_88 monto = 49.90 momento = 16:32 aplicar_descuento() comportamiento acoplado se despliega WQuestions · grafo abierto venta_001 O vendedor_17 cliente camiseta 49.90 16:32 venta los datos son cables; el comportamiento vive aparte
Figura 12.1. La misma venta, dos veces. A la izquierda, el objeto de la POO: una caja que encierra datos y el método que los manipula, con su esquema fijado en el código. A la derecha, la venta desplegada como grafo: cada atributo es un cable tipado y el comportamiento ya no vive dentro del dato.

Dónde se rompe el puente

La analogía es buena para entrar, y traicionera si se la lleva más allá. Hay dos diferencias que no son de grado, sino de naturaleza, y conviene nombrarlas con precisión.

La primera: la POO acopla datos y comportamiento; WQuestions los desacopla. Un objeto Venta guarda el monto y sabe aplicarse un descuento: el dato y el código que lo toca viven en la misma caja. Eso es elegante para programar, pero ata la información a un lenguaje y a una versión del software. Nuestras tripletas no saben hacer nada: son afirmaciones inertes sobre el mundo. El comportamiento (cómo calcular un descuento, cómo validar una venta) vive en otra capa, separado del hecho. Un dato que no carga lógica es un dato que cualquier sistema puede leer sin importar en qué lenguaje fue escrito.

La segunda: la POO fija el esquema en el código (mundo cerrado); WQuestions es de mundo abierto. En cuanto compilas la clase Venta, sus campos quedan tallados en piedra. Si mañana el negocio quiere registrar el lote de inventario del artículo, alguien debe abrir el archivo, añadir un atributo, recompilar y migrar los datos viejos. Añadir un cable nuevo a un sujeto del grafo, en cambio, es escribir una tripleta más; no hay esquema que recompilar porque el esquema nunca estuvo cerrado. Esta es, en una frase, la diferencia entre un mundo que solo admite lo previsto y uno que admite lo que la realidad traiga.

Idea clave

La POO encierra datos y comportamiento en una caja cuyo esquema se fija al compilar (mundo cerrado). WQuestions deja los datos como tripletas inertes y abiertas, y manda el comportamiento a otra capa (mundo abierto). No es que una sea correcta y la otra no: sirven a propósitos distintos. La POO optimiza la ejecución de un programa; WQuestions optimiza que muchos programas distintos compartan los mismos hechos.

Un último hilo conecta esta sección con el capítulo anterior. En la POO, dos variables que apuntan al mismo objeto comparten su referencia (ese puntero invisible que distingue «el mismo objeto» de «un objeto igual»). Esa referencia es, ni más ni menos, lo que en el capítulo 11 llamamos el identificador único: el ancla que permite a un hecho hablar de venta_001 y a otro, en otro sistema, hablar de la misma venta sin confundirla con su gemela. El puntero del objeto y el UID del grafo cumplen la misma función: dar identidad estable a una cosa.

Resumamos el puente entero en una sola tabla. A la izquierda, el vocabulario que el ingeniero ya domina; a la derecha, su correspondiente en el modelo.

Programación orientada a objetosWQuestionsComentario
ClaseConcepto del eje KEl molde, la categoría atemporal.
Instanciación (new Venta())Cable instancia_deFabricar un individuo del molde.
Herencia (extends)Cable subtipo_deEspecializar una categoría.
Atributo / campoPredicado funcional del eje MUn valor por sujeto.
Asociación / referenciaPredicado del eje M a otra entidadUn cable hacia otro nodo.
Referencia de objeto (puntero)Identificador único (UID)Misma función: identidad estable.
Método (comportamiento) (vive en otra capa)El modelo desacopla el dato del código.
Esquema fijado al compilarEsquema abierto y extensibleMundo cerrado vs. mundo abierto.

Puente dos · Bits

Pasada la primera objeción, el programador afina la segunda, y es más visceral. «Vale —dice—, entiendo el mapa con la POO. Pero descomponer cada venta en seis, diez, veinte tripletas parece un caos. Donde yo guardaba una fila ahora tengo veinte líneas. Eso es muchísimo más almacenamiento, y leer veinte líneas para entender una venta es agotador.» La objeción es legítima, y la respuesta exige cambiar de escala mental.

Las tripletas son al conocimiento lo que los bits son a todo lo digital: atómicas, uniformes, abrumadoras de a una, e imprescindibles en masa.El principio del bit

Detengámonos en esa frase, porque es la clave de la sección. Una fotografía, vista por dentro, son millones de unos y ceros. A ningún ingeniero se le ocurriría quejarse de que «un bit no dice nada» o de que «son demasiados para leerlos». El bit no se diseñó para que un humano lo lea de a uno: se diseñó para ser la unidad uniforme y atómica sobre la que se construye todo lo digital, precisamente porque su simplicidad permite operar billones de ellos a velocidad de máquina. La tripleta aspira a ser exactamente eso para el conocimiento: el átomo uniforme de la digitalización del significado.

una foto millones de bits 0110100101110010 1011001110100101 misma idea una escena miles de tripletas (venta_001, vendedor, …) (venta_001, monto_usd, …)
Figura 12.2. Una foto se digitaliza en millones de bits; una escena se digitaliza en miles de tripletas. En ambos casos, la unidad es minúscula y abrumadora de a una, pero es justo esa atomicidad uniforme la que vuelve la información operable a escala de máquina.

Queda el miedo al almacenamiento, que es el más concreto. ¿No ocupa una barbaridad guardar cada hecho como una tripleta de texto larga, con su sujeto y su predicado repetidos miles de veces? La respuesta es que no, y la razón merece detallarse, porque deshace un malentendido común.

Las bases especializadas en tripletas (los triple stores) jamás guardan el texto literal que tú escribes. Aplican codificación por diccionario: cada cadena que se repite (un predicado como monto_usd, un valor como vendedor_17) se almacena una sola vez en una tabla y, de ahí en adelante, se referencia por un número entero corto. Donde tú ves vendedor_17 mil veces, la máquina ve un entero mil veces (y los enteros se comprimen casi a la nada cuando se repiten). A eso se suma el almacenamiento columnar, que guarda juntos todos los valores de una misma posición, donde la redundancia es máxima y la compresión, brutal.

En la práctica

El predicado instancia_de puede aparecer en cien millones de tripletas. En disco no son cien millones de copias de la palabra: es un entero, repetido en una columna que el compresor reduce a casi nada. La máquina nunca «lee» la tripleta como texto humano; opera sobre enteros. Lo que para ti es prosa, para ella son índices. El temor al tamaño nace de imaginar el grafo como un archivo de texto gigante, y esa imagen es falsa.

El programador escéptico empieza a aflojar. Las tripletas no son un derroche: son la versión del bit aplicada al significado, y la industria del almacenamiento ya resolvió hace décadas el problema de comprimir cosas atómicas y repetidas. Lo cual nos lleva, naturalmente, a las bases de datos que hacen justo esto.

Puente tres · Grafos: bases ya no relacionales, sino dirigidas al dato

«Está bien —concede el ingeniero—, pero todo esto, ¿en qué motor lo corro? Yo tengo PostgreSQL.» Aquí la respuesta es la más alentadora de todo el capítulo: no hace falta inventar nada. La industria lleva veinte años construyendo bases de datos que abandonaron el modelo de tablas para abrazar el modelo de la red de nodos y enlaces (el grafo). WQuestions no compite con ellas; encuentra en ellas su hogar natural. El contraste con el modelo relacional ya lo desarrollamos en el capítulo 8: aquí miramos las alternativas que sí encajan.

Esas tecnologías se agrupan en tres familias, y conviene conocerlas por su nombre, porque la afinidad con WQuestions varía mucho de una a otra.

Triple / RDF(8) stores. Son las más cercanas en espíritu: guardan el mundo, literalmente, como tripletas (sujeto, predicado, objeto), igual que nosotros. Nacieron del estándar RDF de la web semántica. En esta familia están Apache Jena (con su servidor Fuseki), GraphDB, Blazegraph, Virtuoso, Amazon Neptune y Stardog. Si WQuestions tuviera que elegir un motor de fábrica, sería uno de estos: la unidad de almacenamiento ya es la tripleta.

Property graphs (grafos de propiedades). En vez de tripletas puras, modelan el mundo como nodos y aristas a los que se les cuelgan propiedades. Son extraordinariamente rápidos para recorrer relaciones («amigos de amigos», rutas, cadenas de suministro). Los referentes son Neo4j, Memgraph y TigerGraph. Encajan bien, aunque su modelo de propiedades en la arista exige una traducción menor respecto de nuestra tripleta canónica.

Datalog, inmutables y temporales. Aquí ocurre la coincidencia más asombrosa del capítulo. Datomic y XTDB guardan la información como datoms: hechos de la forma [entidad, atributo, valor, tiempo-de-transacción]. Léelo de nuevo. Es nuestra tripleta (entidad, predicado, valor) más una marca temporal. Casi exactamente lo que el modelo propone. Y XTDB es bitemporal de fábrica: distingue de raíz entre cuándo ocurrió un hecho en el mundo y cuándo el sistema se enteró, que es justo la distinción de la vigencia (la regla D6 del capítulo 9).

El datom de Datomic merece quedar escrito al lado de nuestra tripleta, porque el parecido es difícil de exagerar:

tripletas
// WQuestions — tripleta tipada
(venta_001, monto_usd, 49.90)                       ∈ M(O, N)

// Datomic / XTDB — datom: tripleta + tiempo de transacción
[venta_001  :monto_usd  49.90   tx-2026-05-14T16:32]

// la única diferencia: ellos añaden el "cuándo lo supo el sistema" de fábrica

Pongamos las tres familias en una tabla, marcando con claridad cuáles son las más afines al modelo. La afinidad alta significa que adoptar WQuestions sobre ese motor casi no exige traducción.

FamiliaUnidad de datoEjemplosAfinidad con WQuestions
Triple / RDF stores Tripleta (s, p, o) Jena/Fuseki, GraphDB, Blazegraph, Virtuoso, Amazon Neptune, Stardog Muy alta · la unidad ya es la tripleta
Datalog · inmutables · temporales Datom [e, a, v, t] Datomic, XTDB (bitemporal de fábrica) Máxima · tripleta + tiempo, casi idéntica
Property graphs Nodo + arista con propiedades Neo4j, Memgraph, TigerGraph Alta · recorrido veloz, traducción menor
Relacional (referencia, ver cap. 8) Fila en una tabla de esquema fijo PostgreSQL, MySQL, Oracle Posible, pero forzada · tablas rígidas

Precedente

El modelo de datos de Datomic, ideado por Rich Hickey, y su sucesor de código abierto XTDB son los precedentes industriales más directos de WQuestions en lo que toca al almacenamiento. Comparten tres convicciones profundas: el dato es una tripleta (allí, un datom); los hechos no se sobrescriben sino que se acumulan; y el tiempo es un eje de primera clase, no una columna más. Donde WQuestions añade valor sobre ellos es en la semántica: tipar cada predicado por los ejes de las preguntas, de modo que el grafo no solo sea consultable, sino interoperable entre dominios y entendible por una IA sin manual.

Puente cuatro · Cadenas: lo que tomamos de la blockchain

Queda la objeción que el programador soltó al principio, casi con desdén: «esto de los hechos que no se borran suena a blockchain, y eso fue una burbuja». Aquí conviene separar la tecnología de moda de la idea que la hizo valiosa, porque la idea es excelente y WQuestions la hereda casi de oficio.

Lo notable es que el modelo ya tiene, sin haberlo buscado, los dos cimientos de un libro mayor al estilo blockchain. El primero: los hechos son inmutables. En WQuestions nunca se borra ni se sobrescribe nada; corregir el mundo significa afirmar un hecho nuevo que deja en evidencia al anterior, no pisarlo. El segundo: la bitemporalidad de la regla D6 (capítulo 9), que fecha cada situación con su rango de vigencia. Junta esas dos piezas y obtienes, sin agregar línea alguna, un libro mayor de solo-anexar (append-only) y auditable: la historia completa de cómo el sistema fue creyendo lo que cree, conservada intacta.

Idea clave

Inmutabilidad de los hechos + bitemporalidad (D6) = un libro mayor append-only y auditable, gratis. No es algo que WQuestions deba construir: es lo que ya es. La blockchain hizo célebre la idea de un registro que solo crece y nunca se reescribe; el modelo la tenía desde su primera decisión de diseño.

Sobre esa base, importar el resto de la maquinaria de la blockchain es directo, y son tres piezas que se agregan encima de lo que ya existe.

Procedencia por hecho. Cada tripleta puede llevar pegada su propia credencial: quién la afirmó, en qué momento, y una firma criptográfica que lo prueba. No es metadato cosmético —es la diferencia entre un dato y un dato de quién responde por él. Esto se modela, como todo, reificando: el acto de afirmar se vuelve una situación con su agente, su instante y su firma.

JSON
{
  "hecho":      ["venta_001", "monto_usd", 49.90],
  "afirmado_por": "vendedor_17",
  "momento":      "2026-05-14T16:32:00-05:00",
  "firma":        "0x9f2a…c4",
  "hash_previo":  "0x71be…08",
  "hash":         "0xa3d0…11"
}

Hash-encadenado (Merkle). Si cada hecho guarda el hash del anterior (como en el campo hash_previo de arriba), la cadena entera se vuelve evidencia de manipulación: alterar un hecho viejo rompe todos los hashes que vinieron después, y la falsificación salta a la vista al instante. Es la misma garantía criptográfica que sostiene una blockchain, aplicada a nuestro libro de hechos.

Consenso y federación. Cuando el grafo deja de pertenecer a una sola empresa y pasa a ser compartido entre varias (el sueño de la interoperabilidad con el que abrió este libro), hace falta un protocolo que decida qué hechos entran al registro común y quién puede afirmar qué. Ahí entran las ideas de consenso y federación. Pero eso ya es terreno de la seguridad del grafo compartido, que el capítulo 29 trata a fondo.

Q vendedor_17 Q auditor_03 Q sistema_pos hecho #1 monto_usd = 49.90 prev: 0x00 hash: 0x71be hecho #2 corrige → 47.90 prev: 0x71be hash: 0xa3d0 hecho #3 medio_pago = … prev: 0xa3d0 hash: 0xc4f1 cada bloque encadena el hash del anterior · alterar uno rompe la cadena
Figura 12.3. Tres hechos sucesivos sobre una misma venta, cada uno firmado por su agente (arriba) y encadenado por el hash del anterior. El hecho #2 corrige el monto sin borrar el #1; el #3 añade información. Manipular cualquiera de ellos rompería el encadenamiento, y la alteración quedaría a la vista.

Nótese el detalle del hecho #2 en la figura: corrige el monto a 47,90 sin borrar el 49,90 original. Eso es exactamente la inmutabilidad del modelo en acción, anudada con la vigencia del capítulo 9: el hecho viejo cierra su rango, el nuevo abre el suyo, y la cadena de hashes deja constancia firmada de quién hizo la corrección y cuándo. Un auditor que llegue dentro de cinco años podrá reconstruir la verdad completa.

El escéptico, convencido

Volvamos al programador del comienzo, que ya no levanta la ceja. Las cuatro objeciones tenían fundamento, y las cuatro tienen respuesta. WQuestions se parece a la POO en cómo piensa las cosas y las categorías, pero la supera al desacoplar el dato del comportamiento y abrir el esquema. Se parece a una avalancha de bits, y por la misma razón que los bits funcionan: la atomicidad uniforme es lo que vuelve la información operable y comprimible a escala. Vive en las bases de grafos que la industria ya construyó (y en Datomic y XTDB casi sin traducción). Y hereda lo mejor de la blockchain (el registro inmutable y auditable) sin pagar el precio de la moda.

WQuestions no pide tirar lo que ya sabes. Pide reconocer que las preguntas estaban debajo de todo eso desde el principio.El sentido de los cuatro puentes

Ninguno de estos puentes es decorativo. Cada uno responde a un lector que llega con su propia herramienta favorita y la pregunta legítima de «¿esto qué me aporta sobre lo que ya tengo?». La respuesta, repetida cuatro veces, es la misma: WQuestions no reemplaza tu pila tecnológica; le pone debajo una capa de significado (los ejes de las preguntas) que hace que tus objetos, tus bits, tus grafos y tus cadenas por fin se entiendan entre sí. Con los cuatro puentes tendidos, estamos listos para la última pieza del lenguaje a los hechos: cómo el verbo de una frase se convierte en la signatura tipada de un predicado, que es el asunto del capítulo siguiente.