Grafo de Stack Overflow en español

Preparando el motor…

Al abrir la página se descargan Users, Posts y Tags completos desde el dump publicado en dsevilla/bd2-data (unos 61,3 MB comprimidos) y se construye el grafo aquí mismo: primero el esquema, después la carga. Puede tardar varios minutos y necesitar varios GB de memoria; nada sale de tu navegador. El botón permite cambiar a la muestra reducida (unos 6,9 MB), con una pregunta de cada ocho y su hilo completo; las cifras serán menores.

Descargar JSONL completo Descargar JSONL reducido

Cómo se ha creado este grafo

En Neo4j se puede empezar a crear nodos sin declarar nada: el esquema es opcional y cada nodo lleva sus propiedades consigo. Aquí no. Ladybug —como Kuzu, del que procede— es una base de grafos tipada y columnar: cada clase de nodo y cada clase de relación es una tabla con columnas de tipo fijo, guardadas por columnas y recorridas de forma vectorizada. Eso es lo que le permite resolver recorridos de varios saltos deprisa sobre un WebAssembly de pocos megabytes, y el precio es declarar antes qué hay en el grafo.

Tres consecuencias que se notan al escribir consultas, y que conviene tener presentes porque en Neo4j no ocurren: hay que crear las tablas antes de cargar nada; un nodo tiene una sola etiqueta, así que (:Post:Question) no existe y la distinción pregunta/respuesta va en la propiedad PostTypeId (1 pregunta, 2 respuesta); y una relación sólo une los tipos declarados en su FROM … TO …, de modo que el propio esquema documenta qué recorridos tienen sentido.

Del documento al grafo: qué campo del JSONL completo se convierte en qué.
En los documentosEn el grafo
Usersnodo (:User), identificado por Id
Postsnodo (:Post), con PostTypeId para distinguir pregunta de respuesta
Tagsnodo (:Tag), identificado por TagName
Posts.OwnerUserId(:User)-[:WROTE]->(:Post)
Posts.ParentId(:Post)-[:ANSWERS]->(:Post)
Posts.Tags («<una><otra>»)(:Post)-[:TAGGED_WITH]->(:Tag)
Ver las sentencias que se acaban de ejecutar

Esto es literalmente lo que corre la página al cargar: primero el esquema, luego la carga masiva con COPY. Puedes copiar cualquier parte en un editor de abajo y ejecutarla. La última relación, INTERESTED_IN, empieza vacía: la llenan con MERGE los ejercicios de «Escritura y modelado», que en Neo4j no necesitarían declararla.

…